1

我有一个名为 Data 的模板类

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

我想定义一个能够拥有多种数据类型的新类。

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

如果我将 Multi_Data 定义为模板,我一次只会有一种类型。 我如何编写一个能够添加不同模板的类,如下所示

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

3 回答 3

3

您所描述的看起来像是Boost.Any库的完美用例,它提供了一种类型安全、统一的方式来存储多种不同类型的对象。我相信你可以boost::any在这里使用你的MultiData类型存储对象类型vector<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;
};

但是,如前所述,将不同类型的数据保存在一个列表中是一个坏主意。估计是设计有问题,再看一遍。

于 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 回答