2009-03-30 9 views
8

Mi piacerebbe costruire un messaggio con lunghezza o numero di argomenti sconosciuti. Ho preso un semplice modello di comeCome inserire diversi tipi di modello in un vettore

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

e con un po 'sovraccarico

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

(uguale per archi e così via) cerco di spingere tutto in un vettore. Ho provato

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

ma niente di tutto ciò sembra funzionare. C'è un modo per fare questo? Grazie in anticipo.

risposta

13

Opzione 1: assicurarsi che tutti i diversi tipi di argomenti derivino da una classe base e utilizzare i puntatori a quella classe. Si noti che questa opzione è rischiosa in termini di gestione della memoria. Potresti renderlo più sicuro utilizzando boost :: shared_ptr anziché puntatori. Altrimenti, è necessario pulire manualmente quando un elemento viene rimosso dal vettore.

Opzione 2 (il mio preferito): utilizzare Boost.Variant per fare un typedef di tutti i possibili tipi di argomenti e l'uso che typedef come tipo di argomento a std :: vector

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

Sembra che mi sia sbagliato quando pensavo che i modelli fossero fatti per avere "tutti i tipi" a portata di mano. Dato che non c'è Boost usato in questo progetto, rimarrò legato all'ereditarietà. thx – DaClown

+0

'std :: variant' è disponibile da C++ 17. http://en.cppreference.com/w/cpp/utility/variant – biowep

6

Il modo più semplice per fare questo sarebbe essere per avere una classe Argument di base, che non è basata su modelli, e quindi derivarne i tipi di dati specifici. (Si potrebbe persino fare in modo che la versione basata su modelli derivi direttamente dalla classe base e utilizzare semplicemente queste due classi.) Quindi li si memorizza come puntatori in un vettore.

Ciò richiede di avere una sorta di funzioni per accedere ai valori dell'argomento ed eseguire eventuali conversioni come richiesto.