如何编写模板类来存储不同的模板类

时间:2013-01-09 04:56:51

标签: c++ templates

我有一个名为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);

3 个答案:

答案 0 :(得分: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实例化的值。

希望这有帮助!

答案 1 :(得分: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;
};

然而,如上所述,将不同类型的数据保存在一个列表中是个坏主意。我想,设计中存在缺陷,请再次检查。

答案 2 :(得分:1)

如果您要存储的数量有限(且固定)类型,请查看Boost.Variant

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

它使您可以使用访问机制而无需使用强制转换或虚函数。