Почему аргументы шаблона по умолчанию разрешены только в шаблонах классов? Почему мы не можем определить тип по умолчанию в шаблоне функции-члена? Например:
struct mycclass {
template<class T=int>
void mymember(T* vec) {
// ...
}
};
Вместо этого C ++ заставляет использовать аргументы шаблона по умолчанию только для шаблона класса.
struct S { template <class R = int> R get_me_R() { return R(); } };
параметр шаблона не может быть выведен из контекста.template <int N = 1> int &increment(int &i) { i += N; return i; }
, а затемincrement(i);
илиincrement<2>(i);
. Как это, я должен написатьincrement<1>(i);
.Ответы:
Имеет смысл дать аргументы шаблона по умолчанию. Например, вы можете создать функцию сортировки:
C ++ 0x знакомит их с C ++. Смотрите этот отчет о дефектах Бьярна Страуструпа: Аргументы шаблона по умолчанию для шаблонов функций и что он говорит
источник
double
в моем случае). Возможно, это не «общее», но есть ли недостаток в этой практике? Спасибо.error: invalid conversion from ‘int’ to ‘int*’
любая идея, почему: `#include <массив> #include <алгоритм> #include <функционал> шаблон <имя-итератора typename Comp = std :: less <итератор>> void my_sort ( Итератор, начало, Итератор конец, Comp c = Comp ()) {std :: sort (beg, end, c); } int main () {std :: array <int, 5> ar {5,2,21,7,4}; my_sort (ar.begin (), ar.end ()); } `Цитировать шаблоны C ++: Полное руководство (стр. 207):
источник
Пока что все предложенные примеры параметров шаблона по умолчанию для шаблонов функций могут быть выполнены с перегрузками.
арак:
может быть:
Мой собственный:
может быть:
LITB:
может быть:
Страуструп:
Может быть:
Что я доказал с помощью следующего кода:
Вывод на печать соответствует комментариям для каждого вызова функции f, а закомментированный вызов не может быть скомпилирован должным образом.
Поэтому я подозреваю, что параметры шаблона по умолчанию «не нужны», но, вероятно, только в том смысле, в котором аргументы функций по умолчанию «не нужны». Как указывается в отчете о дефектах Страуструпа, добавление необработанных параметров было слишком поздно для того, чтобы кто-либо мог понять и / или действительно оценить, что он сделал полезными значения по умолчанию. Таким образом, текущая ситуация основана на версии шаблонов функций, которая никогда не была стандартной.
источник
template<typename T = void> int SomeFunction();
. Параметр шаблона здесь никогда не используется, и фактически функция никогда не вызывается; единственное место, на которое он ссылается, находится вdecltype
илиsizeof
. Имя намеренно совпадает с именем другой функции, но тот факт, что это шаблон, означает, что компилятор предпочтет свободную функцию, если она существует. Они используются в SFINAE для обеспечения поведения по умолчанию, когда определение функции отсутствует.В Windows во всех версиях Visual Studio вы можете преобразовать эту ошибку ( C4519 ) в предупреждение или отключить ее следующим образом:
Смотрите подробности здесь .
источник
Я использую следующий трюк:
Допустим, вы хотите иметь такую функцию:
Вам не разрешат, но я поступлю следующим образом:
Таким образом, вы можете использовать это так:
Как видим, нет необходимости явно устанавливать второй параметр. Может быть, это будет кому-то полезно.
источник