Pregunta

C++ 0x tiene alias de plantilla (a veces denominados tipos de plantilla).Ver aquí.La especificación actual de C++ no.

¿Qué te gusta usar como solución alternativa?¿Objetos contenedores o macros?¿Sientes que vale la pena?

¿Fue útil?

Solución

¿Qué te gusta usar como solución alternativa?¿Objetos contenedores o macros?¿Sientes que vale la pena?

La forma canónica es utilizar una metafunción como esta:

template <typename T>
struct my_string_map {
    typedef std::map<std::string, T> type;
};

// Invoke:

my_string_map<int>::type my_str_int_map;

Esto también se usa en STL (allocator::rebind<U>) y en muchas bibliotecas, incluido Boost.Lo utilizamos ampliamente en un biblioteca bioinformática.

Está inflado, pero es la mejor alternativa el 99% de las veces.El uso de macros aquí no vale la pena por las muchas desventajas.

(EDITAR:Modifiqué el código para reflejar las convenciones de Boost/STL como lo señaló Daniel en su comentario).

Otros consejos

template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

No deberías heredar de clases que no tengan un destructor virtual.Está relacionado con que los destructores en las clases derivadas no se llaman cuando deberían y podría terminar con memoria no asignada.

Dicho esto, probablemente podrías salirte con la tuya en el caso anterior porque no estás agregando más datos a tu tipo derivado.Tenga en cuenta que esto no es un respaldo.todavía te aconsejo no hazlo.El hecho de que tu poder ¿No significa tú? debería.

EDITAR:Sí, esta es una respuesta a la publicación de ShaChris23.Probablemente me perdí algo porque apareció encima de su mensaje en lugar de debajo.

A veces puedes simplemente escribir explícitamente los typedefs sin plantilla para todos los tipos necesarios.Si la clase base tiene una plantilla en múltiples argumentos de plantilla con un solo tipo que desea ser definido, puede heredar una clase especializada con typedef incluido efectivamente en el nombre de la clase heredada.Este enfoque es menos abstruso que el enfoque de la metafunción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top