2009-03-30 12 views
8

長さや引数の数が不明なメッセージを作成したいと思います。私は1つのベクトルに異なるテンプレートタイプを入れる方法

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

のような単純なテンプレートを取り、いくつかのオーバーロードされた

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

(ように文字列とも同じ)と私は1つのベクトルにそれをすべてをプッシュしよう。私は試しました

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

しかし、これは何も動作していないようです。これを行う方法はありますか?前もって感謝します。

答えて

13

オプション1:すべての異なるタイプの引数が基本クラスから派生し、そのクラスへのポインタを使用することを確認します。このオプションはメモリ管理の点で危険です。ポインタの代わりにboost :: shared_ptrを使うと、より安全にしたいかもしれません。それ以外の場合は、アイテムがベクターから削除されるときに手動でクリーンアップする必要があります。

オプション2(私の個人的な好み):これを行うには、すべての可能な引数の型のtypedefでを作るとstdで引数の型として、そののtypedefを使用するようにBoost.Variantを使用::ベクトル

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

テンプレートが「すべてのタイプ」を手にしていると思ったとき、間違っていたように見えます。このプロジェクトではBoostは使用されていないので、私は継承に固執します。 thx – DaClown

+0

'std :: variant'はC++以来利用可能です17。 http://en.cppreference.com/w/cpp/utility/variant – biowep

4

あなたは ブースト::バリアントを使用することができます(http://www.boost.org/doc/libs/1_38_0/doc/html/variant.html
または後押し::任意の(http://www.boost.org/doc/libs/1_38_0/doc/html/any.html)タイプ

または無効* - 醜いないが
をタイプセーフか一つのインタフェースを持っています独自のジェネリック型を実装異なるテンプレート化された実装であり、このインタフェースにポインタを格納します。

しかし、同様のタイプを使用するとデザインが良いとは確信できません。

6

最も簡単な方法になりテンプレート化されていない基底のArgumentクラスを持っていて、そこから特定のデータ型を派生させる必要があります。 (テンプレートベースのバージョンを直接ベースクラスから派生させて、それらの2つのクラスを使用することさえできます)。次にそれらをベクトルとしてポインタとして格納します。

これには、引数値にアクセスし、必要に応じて任意の変換を実行するための関数が必要です。

関連する問題