2

次のように定義された構造体があります。

template <typename T> 
struct data {
  int num;
  T *ptr;
};

次のようなさまざまなタイプを使用して、さまざまなデータ構造体の std::list を作成したいと思います。

struct data<My_Favorite_Type> a;
struct data<My_Second_Favorite_Type> b;

これらの両方の構造体を受け入れる std::list を宣言できるかどうかはわかりません。これらの std::list を作成することは可能ですか? 回避策として、構造体を一般的なリンクリストにすることができると思いますが、可能であれば標準ライブラリを使用したいと思います。

4

3 に答える 3

2

stdコンテナ内に格納されるタイプは統一されている必要があります。したがって、これを行うことはできません。

std::list<data> some_data;
some_data.push_back(data<int>());
some_data.push_back(data<float>());

場合によっては、リストを2つだけ持つことが適切な解決策です。:)

問題について考える別の方法がいくつかありますが、それらがあなたに適しているかどうかを判断するのは難しいです。

それらはポインタであり、動的に処理できます。この例では、データが何であるかは実際には関係ありません。単にデータを印刷したいだけです。

struct base {
  virtual ~base() {}
  virtual void print() const = 0;
};

template<typename T>
  struct data : public base {
    virtual void print() const {std::cout << num << std::endl;}
    int num;
    T *ptr;
  };

std::list<base *> some_data;

を使用することもできますboost::variant

typedef boost::variant<
    data<int>
    ,data<float>
  > data_variant;

std::list<data_variant> some_data;

バリアントを快適にする他のツールはですboost::static_visitor

于 2012-01-26T20:10:28.400 に答える
1

いいえ、あなたがしようとしていることは不可能ですが、boost::any.

于 2012-01-26T19:55:48.237 に答える
0

詳細な回答は「いいえ、不可能です」です(詳細でない回答は短すぎます)。

于 2012-01-26T19:54:01.273 に答える