Значение по умолчанию функции шаблона C++

Можно ли определить значение по умолчанию для переменных функции шаблона в С++?

Что-то вроде ниже:

template<class T> T sum(T a, T b, T c=????)
{
     return a + b + c;
}

person MBZ    schedule 21.07.2010    source источник


Ответы (5)


Попробуй это:

template<class T> T sum(T a, T b, T c=T())
{
     return a + b + c;
}

Вы также можете указать T(5), если вы ожидаете целочисленный тип и хотите, чтобы значение по умолчанию было равно 5.

person Scharron    schedule 21.07.2010

Все зависит от предположений, которые вы можете сделать о типе.

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 ).

person David Rodríguez - dribeas    schedule 21.07.2010
comment
Аргументы по умолчанию создаются только в том случае, если они используются. Это означает, что в них можно поместить любую сумасшедшую вещь, которая вообще не будет совместима с T, и это будет нормально, пока вы передаете явный аргумент. - person Johannes Schaub - litb; 21.07.2010

Да, вы можете определить значение по умолчанию.

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;
}

К сожалению, функция convertThird не может принимать a и b в качестве аргументов.

person computinglife    schedule 21.07.2010

Да, просто должен быть конструктор для T из любого значения, которое вы туда поместите. Учитывая код, который вы показываете, я предполагаю, что вы, вероятно, захотите, чтобы этот аргумент был 0. Если вам нужно более одного аргумента для конструктора, вы можете указать T(arg1, arg2, arg3) в качестве значения по умолчанию.

person Phil Miller    schedule 21.07.2010

Да!

Однако вы должны хотя бы иметь представление о том, что может быть T, иначе это бесполезно.

Вы не можете установить значение параметров шаблона по умолчанию для функций, т.е. это запрещено:

template<typename T=int> void f(T a, T b);
person Tomaka17    schedule 21.07.2010