Создание функций с помощью макросов

178
25 декабря 2018, 11:50

Как создать макрос PROPERTY, который бы можно использовать следующим образом:

#define PROPERTY(config_type, property_name, childs, ...)
...
class BaseConfig
{
public:
    PROPERTY("int", "name", "child1", "child1_1")
    PROPERTY("float", "name2", "child2",)
};

Который бы разворачивался в следующий класс:

class BaseConfig
{
public:
    int name()
    {
        ...
    }
    float name2()
    {
        ...
    }
};

Внутри функций мне надо получить childs.

Answer 1

Макрос написать можно, но есть две проблемы - variadic macros и тип возвращаемого значения. Но... кто нам мешает написать макрос под наши задачи? Предлагаю для начала сделать просто два макроса

#define INT_PROPERTY1(config_type, property_name, childs) \
    int property_name() { \
       tinyxml2::XMLHandle xml_handle(this->config); \
       xml_handle.FirstChildElement(#childs).FindFirstChild(#property_name).ToElement()->IntText();\
    } \
#define INT_PROPERTY2(config_type, property_name, childs1, childs2) \
    int property_name() { \
       tinyxml2::XMLHandle xml_handle(this->config); \
       xml_handle.FirstChildElement(#childs1).FirstChildElement(#childs2).FindFirstChild(#property_name).ToElement()->IntText();\
    } \

да, можно и дальше продолжать, но как по мне - этого уже хватит на много. А если добавить строки - вообще будет отлично.

Следующим этапом должно быть написание макроса, который получает конечную функцию (IntText) и подставляет, что бы не дублировать.

Но как мне кажется, тут лучше написать парочку шаблонов.

READ ALSO
Как установить .NET FRAMEWORK без взаимодействия пользователя?

Как установить .NET FRAMEWORK без взаимодействия пользователя?

Как установитьNET FRAMEWORK без взаимодействия пользователя? То есть программа проверяет если на PC не установлен

157
Shared Preferences. Как мне реализовать загрузку и запись на облако?

Shared Preferences. Как мне реализовать загрузку и запись на облако?

Я делаю прогу на андроидИ в ней сохранение данных идёт с помощью Shared Preferences

164
После метода main()

После метода main()

Появился такой вопрос

242
Чем заменить PageRequest ? {deprecated}

Чем заменить PageRequest ? {deprecated}

Spring официальная инфа

202