template <class T>
void max (T &a ,T &b)
{}//generic template #1
template<> void max(char &c, char &d)
{} //template specializtion #2
void max (char &c, char &d)
{}//ordinary function #3
что такое различие между 1, 2, и 3?
Вот отрывок из Стандарты кодирования C ++ : 101 Правила, рекомендации и передовой опыт :
66) Не специализируйте шаблоны функций
Специализации шаблонов функций никогда не участвуют в перегрузке: Следовательно, любые написанные вами специализации не повлияют на то, какой шаблон будет использоваться, и это противоречит тому, что интуитивно ожидало бы большинство людей. В конце концов, если бы вы написали нешаблонную функцию с идентичной сигнатурой вместо специализации шаблона функции, нешаблонная функция всегда была бы выбрана, потому что она всегда считается более подходящей, чем шаблон.
Книга советует вам добавить уровень косвенности, реализовав шаблон функции в терминах шаблона класса:
#include <algorithm>
template<typename T>
struct max_implementation
{
T& operator() (T& a, T& b)
{
return std::max(a, b);
}
};
template<typename T>
T& max(T& a, T& b)
{
return max_implementation<T>()(a, b);
}
См. Также:
Правила сопоставления для параметров шаблона незначительно отличаются от правил для перегруженных функций. Пример различий можно увидеть, когда вы пытаетесь вызвать max ()
с аргументами разных типов:
max(1,'2');
Это будет соответствовать перегруженной функции, но не базовому шаблону или специализации.