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

Is it possible to have a template struct array with different types?

本文关键字:结构 数组 同类型 可以使 是否      更新时间:2023-10-16

我不完全确定如何表达这个问题,但快速解释如下:我想要一个有描述的数据结构,然后是一组可以是任何数据类型的属性。

例如:

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

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

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

在我不想要的地方。。。为固定类型,但随着不同属性的添加而添加。

这可能吗?

这个怎么样?

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;
};

变体<>中可以有许多类型,使用的variant类可以将它们中的任何一个存储在向量的每个"槽"中。

简短的回答-如您所示,使用模板是不可能的。模板类之间没有任何关系。

为了拥有不同类的列表(数组、映射等等),您应该使用继承。

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

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

  • boost::any或boost::variant的数组(或容器)
  • 基于枚举的编码(注册类型的一个id),因此您有枚举值和PVOID作为稍后要解析的实际数据
  • 将可能的类型列表限制为"安全类型",就像OLE Automation所做的那样