2009-03-30 17 views
8

Me gustaría construir un mensaje con longitud desconocida o número de argumentos. Tomé una plantilla simple comoCómo poner diferentes tipos de plantilla en un vector

template <typename T> class Argument { 
public: 
    int size; 
    int type; 
    T data; 
}; 

y con un poco sobrecargado

addMessage (int value) { 
    Argument<int> *a = new Argument<int>; 
    vec.push_back(a); 
} 

(igual para cuerda y así sucesivamente) que tratan de empujar todo en un vector. Intenté

std::vector<Argument* > vec; 
std::vector<Argument<typename T>* > vec; 
std::vector<Argument<>* > vec; 

pero nada de esto parece funcionar. ¿Hay alguna forma de hacer esto? Gracias por adelantado.

Respuesta

13

Opción 1: asegúrese de que todos los diferentes tipos de argumentos deriven de una clase base y use punteros a esa clase. Tenga en cuenta que esta opción es arriesgada en términos de gestión de memoria. Es posible que desee hacerlo más seguro mediante el uso de boost :: shared_ptr en lugar de punteros. De lo contrario, debe realizar una limpieza manual cuando se elimine un elemento del vector.

Opción 2 (mi favorito personal): Boost.Variant utilizar para hacer un typedef de todos los posibles tipos de argumentos y el uso que typedef como el tipo de argumento en std :: vector

typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType; 
std::vector<ArgumentType> vec; 
+0

Parece que estaba equivocado cuando pensé que las plantillas están hechas para tener "todos los tipos" a mano. Como no se usa Boost en este proyecto, me quedaré con la herencia. thx – DaClown

+0

'std :: variant' está disponible desde C++ 17. http://en.cppreference.com/w/cpp/utility/variant – biowep

6

La forma más sencilla de hacer esto sería debe tener una clase base de Argumento, que no tiene plantillas, y luego tiene los tipos de datos específicos derivados de ella. (Incluso podría hacer que la versión con plantilla derive directamente de la clase base y simplemente use esas dos clases.) Luego las almacena como punteros en un vector.

Esto requiere tener algún tipo de funciones para acceder a los valores de los argumentos y realizar las conversiones necesarias.

Cuestiones relacionadas