1

Data というテンプレート クラスがあります。

template<class T> 
class Data
{
   vector<T> Data_Container;
...
};

複数のタイプのデータを持つことができる新しいクラスを定義したいと考えています。

class Multi_Data
{
vector< Data<???> > Different_Datas;
}

Multi_Data をテンプレートとして定義すると、一度に 1 つの型だけになります。 このようなさまざまなテンプレートを追加できるクラスを作成する方法:

Data< Type_A > DataA;
Data< Type_B > DataB;
Multi_Data Container;
Container->Add(DataA);
Container->Add(DataB);
4

3 に答える 3

3

あなたが説明していることは、Boost.Anyライブラリの完璧な使用例のように見えます。これは、複数の異なる型のオブジェクトを格納するための型安全で統一された方法を提供します。type の型ストア オブジェクトを作成し、次のような関数を使用してアクセスすることで、boost::anyここで使用できると思います。MultiDatavector<boost::any>

template <typename T> void MultiData::add(const Data<T>& data) {
    Different_Datas.push_back(data);
}

ここで、 はboost::any任意の値を格納しますが、テンプレート ラッパーは のインスタンス化ではない値を挿入することを防ぎますData

お役に立てれば!

于 2013-01-09T05:03:40.730 に答える
3

これは、小さな回避策で解決できます。

class DataA { };
class DataB { };
class DataContainer { };
class DataAContainer : public DataContainer
{
public:
    DataA dataA;
};
class DataBContainer : public DataContainer
{
public:
    DataB dataB;
};

class MultiData
{
private:
    std::vector<DataContainer *> vec;
};

ただし、前述のように、さまざまな種類のデータを 1 つのリストに保持することはお勧めできません。設計に欠陥があると思いますが、もう一度確認してください。

于 2013-01-09T05:07:21.830 に答える
1

保存する型の数が限られている (固定されている) 場合は、Boost.Variantを確認する必要があります。

std::vector<boost::variant<Data<Type_A>,Data<Type_B> > > Container;

これにより、キャストや仮想関数を使用せずに訪問メカニズムを使用できます。

于 2013-01-09T09:24:39.453 に答える