成员变量的不同“种类”之间的区别

时间:2019-10-03 10:36:19

标签: c++ xml c++11 annotations

我正在解析大型XML定义文件。 为此,我已经开始为xml文件中可能遇到的每种“类型”创建类。

<Element Factor="10">Whatever</Element>

当前,我将XML文件中的每个type放在它自己的类中,其中包含一些运算符和该类型的成员。

但是,其中一些types同时具有“子元素”和“属性”。

即:

<MySimpleType min="20" max="100">
    <name>MyName</name>
    <SomeOtherElement>xxxx</SomeOtherElement>
</Mysimpletype>

当前该类如下:

class MySimpleType{
    std::string MyName;
    TSomeOtherElement SomeOtherElement;
    int min;
    int max;
}

我想知道是否有一种方法可以对类成员进行注释,以使所涉及的成员是属性还是元素都变得很清楚。

元素可以具有不同的类型(可以是另一个自定义类),并且属性主要是内置的或ADT的。

有没有一种方法可以清楚地将成员标记为“元素”或“属性”?

(这很重要,我正在将Visual Studio 2015与内置编译器一起使用,所以我正在使用c ++ 11)

2 个答案:

答案 0 :(得分:3)

您可能需要一些包装类型来帮助识别:

template <typename T>
struct attribute { T value; };

等等

struct MySimpleType
{
    std::string MyName;
    TSomeOtherElement SomeOtherElement;
    attribute<int> min;
    attribute<int> max;
};

您可以丰富包装类,使其表现得更像基础类型(operator T&()operator = (const T&),...)

答案 1 :(得分:1)

您可以使用c ++ 11属性来标记您的字段:

class MySimpleType {
    [[fmashiro::element]] std::string MyName;
    [[fmashiro::element]] TSomeOtherElement SomeOtherElement;
    [[fmashiro::attribute]] int min;
    [[fmashiro::attribute]] int max;
};

尽管这会生成有关未知属性的警告。

另一种常见方法是使用空宏:

#define FM_ELEMENT
#define FM_ATTRIBUTE

class MySimpleType{
    FM_ELEMENT std::string MyName;
    FM_ELEMENT TSomeOtherElement SomeOtherElement;
    FM_ATTRIBUTE int min;
    FM_ATTRIBUTE int max;
};

作为最后的选择,只需在声明中添加/* attribute */注释。