2010-06-08 12 views
15

necesito hacer un typedef como este.C++ typedef para plantillas parciales

template< class A, class B, class C > 
class X 
{ 
}; 

template< class B, class C > 
typedef X< std::vector<B>, B, C > Y; 

Acabo de encontrar que no es compatible con C++. ¿Puede alguien aconsejarme sobre cómo lograr lo mismo a través de medios alternativos?

Gracias, Gokul.

+1

posible duplicado de (http [typedef con plantilla?]: // stackoverflow .com/questions/649718/templated-typedef) – Troubadour

Respuesta

18

Si usted tiene un C++ 0x/C++ 1x compilador, que se permitirá con una sintaxis ligeramente diferente (parece como si los compiladores no siendo compatibles con esta función):

template <typename B, typename C> 
using Y = X< std::vector<B>, B, C >; 

Se pueden usar otras técnicas, como la definición de un tipo encerrado en una estructura de plantilla (como Pieter sugiere), o abusar de herencia (evitar si es posible):

template <typename B, typename C> 
class Y : public X< std::vector<B>, B, C > {}; 
+1

Me hace preguntarme sin embargo * por qué * aún no es compatible. ¿Es mucho más difícil que la semántica de movimientos, la tipificación automática, las plantillas variadas o alguna otra cosa que al menos parece difícil de implementar? Pero no tengo mucha experiencia en la construcción de un compilador, mi intuición sobre lo difícil que es * way * off :). – Pieter

+2

Creo que diferentes partes del estándar se decidieron en diferentes momentos: los compiladores deben tener una confianza razonable en que una característica no cambiará antes de que la norma final salga en 2011 antes de que pasen tiempo desarrollándola, y luego decidan cómo encaja eso. a sus horarios de lanzamiento. – AshleysBrain

+0

Soy una persona del futuro. Parece ser compatible en los principales compiladores ahora. – imallett

15

Colocándolo en una estructura. Esta idea se llama alias de plantilla y es parte del estándar C++ 0x (the proposal). Sin embargo, una solución alternativa está dada por:

template<class B, class C> 
struct Y { 
    typedef X<std::vector<B>, B, C> type; 
}; 

y utilizar Y<B, C>::type como su tipo deseado.

Y podría pensar que gcc4.5 o VS2010 ya podrían soportarlo, como es el caso de un gran subconjunto de C++ 0x, pero tengo que decepcionarlo, ya que aún no lo apoyamos:)

+2

Tenga en cuenta que esto puede requerir el uso de la palabra clave 'typename' si' B' o 'C' son en sí mismos parámetros de plantilla. –

Cuestiones relacionadas