2009-03-30 10 views
8

Je voudrais construire un message avec une longueur inconnue ou un nombre d'arguments inconnu. Je pris un modèle simple commeComment mettre différents types de modèles dans un vecteur

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

et avec une certaine surcharge

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

(même pour cordes et ainsi de suite) j'essaie de la pousser dans un vecteur. J'ai essayé

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

mais rien de tout cela ne semble fonctionner. Y a-t-il un moyen de faire cela? Merci d'avance.

Répondre

13

Option 1: assurez-vous que tous les différents types d'arguments dérivent d'une classe de base et utilisez des pointeurs vers cette classe. Notez que cette option est risquée en termes de gestion de la mémoire. Vous pourriez vouloir le rendre plus sûr en utilisant boost :: shared_ptr au lieu de pointeurs. Sinon, vous devez nettoyer manuellement lorsqu'un élément est supprimé du vecteur.

Option 2 (mon préféré): utiliser Boost.Variant pour faire un typedef de tous les types d'arguments possibles et l'utiliser typedef comme le type d'argument dans std :: vecteur

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

On dirait que j'avais tort quand je pensais que les modèles sont faits pour avoir "tous les types" à portée de main. Comme il n'y a pas de Boost utilisé dans ce projet, je m'en tiendrai à l'héritage. thx – DaClown

+0

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

6

La meilleure façon de le faire serait être d'avoir une classe Argument de base, qui n'est pas basée sur un modèle, et dont les types de données spécifiques en dérivent. (Vous pouvez même faire en sorte que la version basée sur un modèle dérive directement de la classe de base et utiliser ces deux classes.) Ensuite, vous les stockez comme des pointeurs dans un vecteur.

Cela nécessite d'avoir un certain type de fonctions pour accéder aux valeurs des arguments et effectuer les conversions nécessaires.