2009-09-24 12 views
26

Estoy tratando de escribirdedef un mapa unordered_ o std :: dependiendo de si hay bibliotecas TR1 disponibles. Pero no quiero especificar los parámetros de la plantilla. Por lo que he leído hasta ahora, las plantillas de definición de tipos sin argumentos no son posibles hasta que esté disponible el estándar oficial C++ 0x. Entonces, ¿alguien sabe una solución elegante para esto?Tipodef una clase de plantilla sin especificar los parámetros de la plantilla

#ifdef _TR1 
#include <unordered_map> 
typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments 
#else 
#include <map> 
typedef std::map MyMap; //error C2976: too few template arguments 
#endif 
+0

Consulte esta pregunta muy cercana: http://stackoverflow.com/questions/544842/c-typedef-ing-stl y las respuestas proporcionadas. Los typedefs de plantilla no son comandos válidos de C++ –

+1

Benoit - Gracias, eso es exactamente lo que estaba buscando –

+0

Pregunta muy similar: http://stackoverflow.com/questions/6907194/how-to-typedef-a-template-class Tiene otro respuesta que no se menciona aquí: "plantilla de alias" en C++ 11 – Jayesh

Respuesta

36

La forma en que he visto este hecho es envolver el typedef en una plantilla-estructura:

template<typename KeyType, typename MappedType> 
struct myMap 
{ 
#ifdef _TR1 
    typedef std::tr1::unordered_map<KeyType, MappedType> type; 
#else 
    typedef std::map<KeyType, MappedType> type; 
#endif 
}; 

Luego, en el código se invoca así:

myMap<key, value>::type myMapInstance; 

Puede ser un poco más detallado de lo que quieres, pero creo que cumple con la necesidad dado el estado actual de C++.

+3

De hecho, es la forma habitual de simular la falta de tipos de plantilla en C++. Sin embargo, habría llamado al typedef "tipo" en lugar de "valor", parece más correcto semánticamente hablando y es más idiomático. –

+1

Código actualizado, gracias – fbrereto

4

Tienes que usar tipos completos para typedefs.

Use una macro #define en su lugar.

+1

A veces es mejor recurrir a las viejas formas. Programación de cinta adhesiva en su mejor forma. –

+4

lamentablemente las macros no respetan el alcance. – sellibitze

Cuestiones relacionadas