template - typedef c++
¿Cuál es el significado de la plantilla<> con corchetes angulares vacíos en C++? (3)
template<>
class A{
//some class data
};
He visto este tipo de código muchas veces. ¿Cuál es el uso de la template<>
en el código anterior? ¿Y cuáles son los casos en los que necesitamos ordenar su uso?
No se ve bien Ahora, podrías haber escrito en su lugar:
template<>
class A<foo> {
// some stuff
};
... que sería una especialización de plantillas para el tipo foo.
template<>
introduce una especialización total de una plantilla. Tu ejemplo en sí mismo no es realmente válido; necesita un escenario más detallado antes de que sea útil:
template <typename T>
class A
{
// body for the general case
};
template <>
class A<bool>
{
// body that only applies for T = bool
};
int main()
{
// ...
A<int> ai; // uses the first class definition
A<bool> ab; // uses the second class definition
// ...
}
Parece extraño porque es un caso especial de una característica más poderosa, que se llama "especialización parcial".
template<>
le dice al compilador que sigue una especialización de plantilla, específicamente una especialización completa . Normalmente, la class A
debería verse así:
template<class T>
class A{
// general implementation
};
template<>
class A<int>{
// special implementation for ints
};
Ahora, cuando se usa A<int>
se usa la versión especializada. También puede usarlo para especializar funciones:
template<class T>
void foo(T t){
// general
}
template<>
void foo<int>(int i){
// for ints
}
// doesn''t actually need the <int>
// as the specialization can be deduced from the parameter type
template<>
void foo(int i){
// also valid
}
Normalmente, no deberías especializar funciones, ya que las sobrecargas simples generalmente se consideran superiores :
void foo(int i){
// better
}
Y ahora, para hacerlo exagerado, la siguiente es una especialización parcial :
template<class T1, class T2>
class B{
};
template<class T1>
class B<T1, int>{
};
Funciona de la misma manera que una especialización completa, solo que la versión especializada se utiliza siempre que el segundo parámetro de plantilla sea un int
(por ejemplo, B<bool,int>
, B<YourType,int>
, etc.).