Синтаксис специализации шаблонов C ++ - PullRequest
48 голосов
/ 30 ноября 2011

В C ++ Primer Plus (2001, чешский перевод) я обнаружил следующий синтаксис специализации шаблонов:

шаблон функции

template <typename T> void foo(T);

синтаксис специализации

void foo(int param); // 1
void foo<int>(int param); // 2
template <> void foo<int>(int param); // 3
template <> void foo(int param); // 4
template void foo(int param); // 5

Погуглив немного, я нашел только 3 примера. Есть ли разница между ними (в вызове, компиляции, использовании)? Некоторые из них устарели / устарели? Почему бы просто не использовать № 1?

Ответы [ 2 ]

75 голосов
/ 30 ноября 2011

Вот комментарии с каждым синтаксисом:

void foo(int param); //not a specialization, it is an overload

void foo<int>(int param); //ill-formed

//this form always works
template <> void foo<int>(int param); //explicit specialization

//same as above, but works only if template argument deduction is possible!
template <> void foo(int param); //explicit specialization

//same as above, but works only if template argument deduction is possible!
template void foo(int param); //explicit instantiation

Добавлено мной:

//Notice <int>. This form always works!
template void foo<int>(int param); //explicit instantiation

//Notice <>. works only if template argument deduction is possible!
template void foo<>(int param); //explicit instantiation

С точки зрения кодирования, перегрузка предпочтительнее, чем функция-специализация шаблона.

Итак, не специализируйте шаблон функции:

И знать терминологию:

  • экземпляр
  • явный экземпляр
  • специализация
  • явная специализация

См .:

1 голос
/ 03 января 2014

При использовании Visual Studio 2012 кажется, что он работает немного иначе, если нет аргумента функции:

template <typename T> T bar( );
//template int bar<int>( ) { return 0; } doesn't work
template < > int bar<int>( ) { return 0; } //does work
...