Действительно ли возможно определить значение по умолчанию для переменных шаблонной функции в C++?
Что-то как ниже:
template<class T> T sum(T a, T b, T c=????)
{
return a + b + c;
}
Попробуйте так:
template<class T> T sum(T a, T b, T c=T())
{
return a + b + c;
}
Вы также можете подставить T(5), если вы ожидаете интегральный тип и хотите, чтобы значение по умолчанию было 5.
Да, вы можете определить значение по умолчанию.
template <class T>
T constructThird()
{
return T(1);
}
template <class T>
T test(T a,
T b,
T c = constructThird<T>())
{
return a + b + c;
}
К сожалению, constructThird не может принимать аргументы a и b.
Все зависит от предположений, которые вы можете сделать относительно типа.
template <typename T> T sum( T a, T b, T c = T() ) { return a+b+c; }
template <typename T> T sum2( T a, T b, T c = T(5) ) { return a+b+c; }
В первом случае предполагается, что T
является конструктивным по умолчанию. Для POD-типов это инициализация значения (IIRC) и в основном 0
, так что sum( 5, 7 )
вызовет sum( 5, 7, 0 )
.
Во втором случае требуется, чтобы тип мог быть построен из целого числа. Для интегральных типов, sum( 5, 7 )
вызовет sum( 5, 7, int(5) )
, что эквивалентно sum( 5, 7, 5 )
.
Да, просто должен быть конструктор для T
от любого значения, которое вы туда положите. Учитывая код, который вы показали, я предполагаю, что вы, вероятно, хотите, чтобы этот аргумент был 0
. Если вам нужно более одного аргумента для конструктора, вы можете поместить T(arg1, arg2, arg3)
в качестве значения по умолчанию.
Да!
Однако вы должны хотя бы иметь представление о том, каким может быть T, иначе это бесполезно.
Вы не можете устанавливать значение по умолчанию параметров шаблона для функций, т.е. это запрещено:
template<typename T=int> void f(T a, T b);