2011-11-07 9 views
6

dado:¿Qué función de C++ permite que las clases de plantilla se refieran a sí mismas sin argumentos de plantilla?

template <typename T> 
class C { 
    C & operator ++() { ... } 
}; 

Por qué/cómo se C les permite declarar variables y funciones de tipo C en lugar de ser requerido para nombrar C<T>? Realmente no había pensado en ello antes de trabajar en una plantilla con muchos parámetros que harían que deletrear el inconveniente del "tipo propio".

¿Hay alguna peculiaridad de esto que deba conocer?

Respuesta

6

[n3290: 14.6.1/1]: como las clases normales (no plantilla), clase plantillas tienen un nombre-clase-inyectado (Cláusula 9). El nombre de clase inyectada se puede usar como plantilla-nombre o nombre-tipo. Cuando se utiliza con una plantilla-argumento-lista , como plantilla-argumento para una plantilla-parámetro de plantilla , o como el identificador de final en el elaborado de tipo-especificador de una clase amigo declaración de plantilla, se refiere a la plantilla de clase en sí. De lo contrario, que es equivalente a la plantilla-nombreseguido por los plantilla parámetros- de la plantilla de clase encerrado en <>.

Ostensiblemente, es simplemente una función de conveniencia.

+3

increíble que dos personas upvoted esto mientras que había citado el pasaje equivocado ;-) El poder de citar el estándar - ¡cualquier parte del estándar, evidentemente, no se puede negar! –

+0

Ajá, el concepto que me faltaba era * inyectado-nombre-clase *. ¡Gracias! –

+0

@BenJackson: ¡No hay problema! –

2

Es azúcar sintáctico.

Es conveniente no tener que cambiar las firmas de sus métodos si tiene que cambiar los parámetros de la plantilla.

2

¿Por qué/cómo se le permite a C declarar variables y funciones de tipo C en lugar de tener que nombrar C?

Se acaba de especificar así. El nombre de la plantilla se inyecta en su cuerpo y significa el tipo real (con argumentos).

¿Hay alguna peculiaridad de esto que deba conocer?

Nada serio. Sólo tienes que recordar esto no funciona para las clases de base, por lo que hacer CRTP, que tiene que hacer

template <class T> 
class A : public Base<A<T> > // not Base<A> 
+2

Excepto si 'Base' espera un parámetro de plantilla de plantilla. ;) – Xeo

+0

@Xeo: sí, pero en CRTP, la clase base espera el tipo derivado. – jpalecek

+0

Uno no excluye el otro. – Xeo

Cuestiones relacionadas