2011-11-30 21 views
38

En C++ Primer Plus (2001, traducción Checa) He encontrado estos diferentes sintaxis de la plantilla de especialización:sintaxis de C++ plantillas de especialización

plantilla de función

template <typename T> void foo(T); 

sintaxis especialización

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 

Google buscando un poco, he encontrado solo ejemplos No.3. ¿Hay alguna diferencia (en la llamada, compilación, uso) entre ellos? ¿Algunos de ellos están obsoletos/obsoletos? ¿Por qué no usar el No.1?

+3

Es una buena idea utilizar en general (y pensar en) el término "plantilla de función" ya que esto enfatiza que es una plantilla, no una función, y que donde sea que se necesite una función, no se puede usar una plantilla (solo una especialización, ya que esas son funciones entonces). – PlasmaHH

+0

O bien una mala traducción o simplemente te equivocas. Le sugiero que lea más acerca de la diferencia entre las plantillas y la sobrecarga de funciones. – varepsilon

Respuesta

61

Éstos son comentarios con cada sintaxis:

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 

Añadido por mí:

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

Desde el punto de vista de codificación, es preferible a la sobrecarga de la función de plantilla de especialización .

Por lo tanto, no se especializan plantilla de función:

y conocer las terminologías:

  • instanciación
  • instancias explícita
  • especialización
  • especialización explícita

ver esto:

+4

+1, con una nota de que probablemente sea preferible la sobrecarga. – avakar

+0

@avakar: con el enlace al relacionado [GotW '¿Por qué no especializar plantillas de función?'] (Http://www.gotw.ca/publications/mill17.htm) artículo de Herb Sutter – sehe

+1

@sehe: Agregué el enlace ya en mi respuesta. – Nawaz

2

mediante Visual Studio 2012, parece que funciona ligeramente diferente si no hay un argumento de la función:

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