是否可以使用不同类型的模板结构数组?

时间:2013-12-03 12:16:30

标签: c++ templates struct

我不完全确定如何说出问题,但快速解释如下: 我想要一个包含其描述的数据结构,然后是一堆可以是任何数据类型的属性。

例如:

template <class T>
struct attributeStruct
{
    std::string name;
    T *value;
};

然后是一个以下列方式使用它的结构:

struct dataStructure
{
    std::string name;
    std::string description;
    std::string type;
    attributeStruct<...> **attribute
};

我不希望...是固定类型,但是在添加不同属性时添加。

这可能吗?

3 个答案:

答案 0 :(得分:1)

这个怎么样?

template <class T>
struct dataStructure
{
    std::string name;
    std::string description;
    std::string type;
    attributeStruct<T> **attribute;
};

编辑:所以你想要一个异构的属性数组。我建议使用变体类型,如下所示:

struct dataStructure
{
    std::string name;
    std::string description;
    std::string type;
    std::vector<boost::variant<attributeStruct<int>, attributeStruct<double> > > **attribute;
};

您可以在变体&lt;&gt;中使用多种类型,并使用变体类将任何类型存储在向量的每个“插槽”中。

答案 1 :(得分:0)

嗯,这个问题很老,而且已知解决方案。这取决于您根据当前需求判断利弊:

  • boost :: any或boost :: variant
  • 的数组(或容器)
  • 基于枚举的编码(注册类型的一个id),因此您将枚举值和PVOID作为稍后要解析的实际数据
  • 将可能的类型列表限制为“安全类型”,如OLE自动化

答案 2 :(得分:0)

简短回答 - 您无法使用模板显示它们。 模板类彼此没有关系。

为了获得不同类的列表(数组,映射等),你应该使用继承。

基类可以具有(虚拟)函数,如getName()。 getValue()函数是一个问题,因为基类不知道值的类型,您需要首先将基指针强制转换为派生类指针。如果在基类中声明至少1个虚函数,则可以安全地使用dynamic_cast&lt;&gt;()转换为派生类(例如,从全局getAttributeValue()函数。