Создайте макрос типа Q_PROPERTY и извлеките __VA_ARGS__ - PullRequest
0 голосов
/ 30 сентября 2019

Как работает макрос QT Q_PROPERTY?

Q_PROPERTY:

    Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged)

Мне нужно создать макрос, похожий на Q_PROPERTY. моя цель состоит в том, чтобы хранить в векторе атрибут классов

, например, у меня есть класс Person

Person {

private:

std::string name;
std::string lastname;

public: 

std::string name();
void set_name(std::string name);

}


я хочу сделать что-то вроде Q_PROPERTY в моем классе, чтобы сохранить поля в векторе, какназывается getter, setter, а также тип и имя атрибута

, например, получить из макроса эти данные:

TYPE NAME READ WRITE

если у меня есть макрос:

#define PROPERTY(...)

PROPERTY(std::string name READ name WRITE set_name)
PROPERTY(std::string email READ email WRITE set_email)

как я могу извлечь элементы из VA_ARGS , например, чтобы сделать это:

__VA_ARGS__['TYPE'] this should write std::string
__VA_ARGS__['NAME'] this should write name
__VA_ARGS__['READ'] this should write name
__VA_ARGS__['WRITE']this should write set_name

с этими данными, я хочу написать структуру для сохраненияэто в векторе

и сопоставить весь класс для имитации некоторого отражения.

1 Ответ

1 голос
/ 01 октября 2019

Быстрый ответ: «Вы не можете», потому что Q_PROPERTY - это не просто макрос. Если вы следуете этому в коде Qt, это в конечном итоге ничего не даст. Почему? Он используется препроцессором Qt MOC для создания метаданных о классе. Если вы заглянете в дерево сборки, то увидите сгенерированные файлы .moc. Затем они компилируются вместе с вашим кодом класса.

Другими словами, чтобы получить ту же функциональность, вам понадобится препроцессор, такой как MOC. Я хотел сделать то же самое раньше. Я не мог найти способ без фактической генерации динамического кода C ++ (как это делает MOC). Варианты хороши, но есть определенные ограничения для макросов.

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