web-dev-qa-db-fra.com

Syntaxe de spécialisation des modèles C ++

Dans C++ Primer Plus (2001, traduction tchèque), j'ai trouvé ces différentes syntaxes de spécialisation de modèles:

modèle de fonction

template <typename T> void foo(T);

syntaxe de spécialisation

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

Googler un peu, je n'ai trouvé que des exemples n ° 3. Y a-t-il une différence (d'appel, de compilation, d'utilisation) entre eux? Certains sont-ils obsolètes/obsolètes? Pourquoi ne pas simplement utiliser le n ° 1?

48
Jan Turoň

Voici des commentaires avec chaque syntaxe:

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

Ajouté par moi:

//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

Du point de vue du codage, la surcharge est préférable à la spécialisation de modèle de fonction.

Donc, ne spécialisez pas le modèle de fonction:

Et pour connaître les terminologies:

  • instanciation
  • instanciation explicite
  • spécialisation
  • spécialisation explicite

Regarde ça :

75
Nawaz

En utilisant Visual Studio 2012, cela semble fonctionner légèrement différemment s'il n'y a pas d'argument de fonction:

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