каково различие между Шаблоном Явная Специализация и обычной функцией?

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?

10
задан Amarghosh 28 April 2010 в 10:25
поделиться

2 ответа

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

См. Также:

10
ответ дан 4 December 2019 в 00:23
поделиться

Правила сопоставления для параметров шаблона незначительно отличаются от правил для перегруженных функций. Пример различий можно увидеть, когда вы пытаетесь вызвать ​​max () с аргументами разных типов:

max(1,'2');

Это будет соответствовать перегруженной функции, но не базовому шаблону или специализации.

2
ответ дан 4 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

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