2010-02-10 22 views
5

tengo una clase de plantillaC++ con plantilla typedef

template <T> 
class Example 
{ 
... 
}; 

en cuyo interior hay Hay muchos métodos del tipo siguiente:

template <class U> <class V> method(....) 

dentro de estas I utilizar TR1 :: shared_ptr a U o V o T.

Su tedioso tipeo tr1::shared_ptr<const U> o tr1::shared_ptr<const V>.

La cosa obvia a hacer:

template <typename U> 
typedef tr1::shared_ptr<U> shptr<U>; 

no funciona.

¿Qué haces en esta situación? ¿Algo que pueda reducir la verbosidad?

+1

Duplicados: http://stackoverflow.com/questions/562209/typedef-std-containers, http://stackoverflow.com/questions/1474417/typedef-a-template-class-without-specifying-the-template -parameters, http://stackoverflow.com/questions/544842/c-typedef-ing-stl –

+0

No estoy seguro de que sean duplicados, seguramente están relacionados y podrían ser interesantes para examinar las respuestas, ¿pero duplicados exactos? –

Respuesta

9

puede utilizar un tipo interno:

template <typename U> 
struct sptr { 
    typedef tr1::shared_ptr<U> t; 
}; 

Luego dicen sptr<U>::t, o por desgracia a menudo typename sptr<U>::t.

C++ 0x tiene typedefs plantilla, se puede comprobar si el compilador puede ser persuadido para aceptarlos:

template<typename U> 
using sptr = tr1::shared_ptr<U>; 

Luego diga sptr<U>

Y, por supuesto, siempre hay #define sptr ::tr1::shared_ptr, por ejemplo, si Esperamos C++ 0x en el futuro y queremos cerrar la brecha. O si lo está usando en un contexto lo suficientemente estrecho como para que una macro no atemorice.

+0

El tipo interno es agradable, pero apenas hace que el código sea menos detallado ... – UncleBens

+0

Bueno, lo hace un poco en contextos donde no se necesita 'typename'. De lo contrario, no, no es ideal para algo tan corto como 'tr1 :: shared_ptr '. Si fuera 'std :: vector > :: const_iterator' que necesitara abreviatura, entonces podríamos estar en el negocio :-) –

1
using tr1::shared_ptr; 

debería permitir el uso de shared_ptr sin prefijo, pero eso es todo lo que sé. Lo siento.

+1

Dado que mis definiciones y declaraciones con plantillas tienen que estar en un archivo de encabezado, ¿esto no violará la regla de que no se debe tener una declaración de uso en un archivo de encabezado? – user231536

+0

@ user231536: No veo por qué tendría que ir en el archivo de encabezado, puede simplemente ponerlo en su archivo fuente? Tendría que hacerse en todos los archivos fuente, pero reduciría el desorden de todos modos. – falstro

2

Nada para reducir la verbosidad (excepto lo que dicen las huevas).

Pero buen artículo sobre el problema en sí: Template Typedef.

Se podría realmente necesita este truco si tiene alguna función genérica que espera su tipo para tener alguna typedef asociada, y su tipo es de plantilla (considere que tiene proporcionar result_t y debe ser el parámetro de plantilla!)

Cuestiones relacionadas