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

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

Что-то как ниже:

template<class T> T sum(T a, T b, T c=????)
{
     return a + b + c;
}
7
задан Peter Mortensen 23 June 2015 в 21:40
поделиться

5 ответов

Попробуйте так:

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

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

10
ответ дан 6 December 2019 в 09:17
поделиться

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

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.

2
ответ дан 6 December 2019 в 09:17
поделиться

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

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

7
ответ дан 6 December 2019 в 09:17
поделиться

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

1
ответ дан 6 December 2019 в 09:17
поделиться

Да!

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

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

template<typename T=int> void f(T a, T b);
0
ответ дан 6 December 2019 в 09:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: