Различие между разными «видами» переменных-членов - PullRequest
1 голос
/ 03 октября 2019

Я анализирую большие файлы определений XML. Чтобы добиться этого, я начал создавать классы для каждого «типа», с которым вы можете столкнуться в XML-файле.

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

В настоящее время я помещаю каждый type из XML-файла в его собственный класс с несколькимиоператоры и члены типа.

Однако некоторые из этих 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 со встроеннымкомпилятор, поэтому я использую с ++ 11)

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

У вас может быть какой-нибудь тип оболочки, который поможет определить, что:

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 голос
/ 03 октября 2019

Вы можете использовать атрибуты 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 */ комментарий к объявлению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...