C ++ - Можете ли вы получить только имя переменной из аргумента макроса, где вы указываете тип и имя? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь создать функцию SendEvent внутри макроса, где я определяю структуру события (я использую макрос, чтобы люди могли предоставлять переменное количество аргументов от 1 до 10 в зависимости от того, сколько данных они хочу использовать в своей структуре событий). В качестве примера я буду использовать макрос с тремя аргументами:

#define __MakeEvent3_(ID, t1_, t2_, t3_)                                                    \
struct S ## ID ## Event {                                                                   \
    RegisterEventRecords_(S ## ID ## Event);                                                \
    t1_;                                                                                    \
    t2_;                                                                                    \
    t3_;                                                                                    \
};                                                                                          \
typedef S ## ID ## Event SEvent;                                                            \
inline void Send ## ID ## Event(t1_, t2_, t3_) {                                            \
    SEvent evt;                                                                             \
    evt.t1_ = t1_;                                                                          \
    evt.t2_ = t2_;                                                                          \
    evt.t3_ = t3_;                                                                          \
    level->SendEvent(evt);                                                                  \
}

Макрос вызывается там, где каждый t1_, t2_ и т. Д. c. Аргумент имеет как тип, так и имя, и в зависимости от количества предоставленных аргументов главный макрос разрешит использовать заданный __MakeEventN_():

MakeSystemEvent_(Player, int playernum, MessageType msgtype, char* msg) // invokes __MakeEvent3()_

Проблема в том, что я не знаю способ доступа к имени переменной (т. е. playernum) с использованием только аргумента t1_, поскольку он содержит значение int playernum. Результатом этого является то, что, что неудивительно, я получаю несколько ошибок компилятора при назначении evt.t1_ = t1_, поскольку это даже не жизнеспособное утверждение синтаксиса.

Есть ли какое-либо решение для анализа типа макро-аргумента, который имеет как тип, так и имя переменной, чтобы получить только имя переменной?

...