Подтвердить что ты не робот

Синтаксис симуляции шаблонов С++

В С++ 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. Есть ли разница между ними (в вызове, компиляции, использовании)? Некоторые из них устарели/устарели? Почему бы просто не использовать No.1?

4b9b3361

Ответ 1

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

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

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

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

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

  • конкретизации
  • Явная реализация
  • специализация
  • Явная специализация

Смотрите это:

Ответ 2

Использование 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