Значение по умолчанию для функции шаблона C ++ - PullRequest
7 голосов
/ 21 июля 2010

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

Примерно так:

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

Ответы [ 5 ]

10 голосов
/ 21 июля 2010

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

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

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

7 голосов
/ 21 июля 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 ).

2 голосов
/ 21 июля 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;
}

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

1 голос
/ 21 июля 2010

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

0 голосов
/ 21 июля 2010

Да!

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

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

template<typename T=int> void f(T a, T b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...