9

長さや引数の数が不明なメッセージを作成したいと思います。私は次のような単純なテンプレートを取りました

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;

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

4

3 に答える 3

14

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

オプション 2 (私の個人的なお気に入り) : Boost.Variantを使用して、考えられるすべての引数の型の typedef を作成し、その typedef を std::vector の引数の型として使用します。

typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType;
std::vector<ArgumentType> vec;
于 2009-03-30T08:30:14.227 に答える
6

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

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

于 2009-03-30T08:31:13.630 に答える
5

boost::variant ( http://www.boost.org/doc/libs/1_38_0/doc/html/variant.html )
または boost::any ( http://www.boost.org/doc/ libs/1_38_0/doc/html/any.html ) タイプ

または void* - 醜くタイプセーフではない
か、1 つのインターフェイスと異なるテンプレート化された実装を持ち、このインターフェイスにポインターを格納する独自のジェネリック型を実装します。

しかし、同様のタイプを使用することが良い設計であるかどうかはわかりません。

于 2009-03-30T08:28:50.313 に答える