В моей книге упоминаются два способа явной специализации:
template <> void Swap<int> (int &, int &);
template <> void Swap(int &, int&);
в чем разница между обоими? когда использовать один и когда использовать другой? что именно <> после имени функции?
в чем разница между обоими?
Нет никакой разницы.
Во втором случае вы позволяете компилятору выполнять тип вычета от подписи специализации. Поэтому обе формы декларируют специализацию Swap<T>()
за T = int
,
когда использовать один и когда использовать другой?
На ваше усмотрение, когда та или иная форма соответствует вашим требованиям с точки зрения читабельности или простоты обслуживания.
что именно <> после имени функции?
Когда речь идет о после имени функции, это синтаксис для указания аргументов шаблона:
template<typename T = double, typename U = char>
void foo();
foo<int, bool>(); // Specifies explicit template arguments
foo<>(); // Use default template arguments
foo(); // Same as above, allowed for *function* templates only
Когда речь идет о после template
ключевое слово, это синтаксис для введения специализации шаблона (класса или функции).
Первый пример — это реальный способ явной специализации шаблона, второй пример — всего лишь ярлык для первого пути, поскольку компилятор может определить сам тип из сигнатуры функции. Результат тот же, нет никакой разницы.
<>
используется для присвоения параметра шаблона шаблонной структуре, в этом случае параметр шаблона является типом манипулируемых данных, а специализация — типом int
,