我有一个名为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);
答案 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;
它使您可以使用访问机制而无需使用强制转换或虚函数。