В приведенном ниже примере мы используем функцию C ++ 17 «Вывод аргументов шаблона класса», чтобы сделать вывод, что val
имеет тип Base<int, double, bool>
:
template<class T, class U, class V>
struct Base {
Base(T, U) { };
Base(T, U, V) { };
Base(V) { };
};
void func() {
Base val(1, 4., false);
}
Теперь можно частично указать аргументы шаблона и позволить вывести оставшиеся? Фактически что-то вроде:
Base<V = bool> val1(1, 4.); // U & V deduced --> Base<int, double, bool>
Base<T = bool, T = int> val2(5.); // V deduced --> Base<bool, int, double>
Я пробовал, например,
template<class T, class U> using Base2 = Base<T, U, double>;
void func() {
NewBase2 val(1, 2);
}
но он не компилируется: 'Base2': use of alias template requires template argument list
.
Возможен ли как-то частичный вычет? Если это невозможно напрямую, есть ли хорошие обходные пути?
T
и получитьU
и получитьV
, или указатьT
иU
и получитьV
. Видите узор? Было бы неплохо иметь именованные параметры шаблона в C ++, но, к сожалению, мы этого не делаем. - person Sam Varshavchik   schedule 19.08.2019