один #macro добавить поле и регистр (в switch-case)

Как определить макрос (ALL_SWITCH) распознать другой макрос (SINGLE_CASE) вхождения в виде списка, и вставьте коды в 2 разных местах?

Является ли это возможным?

пример

Я хочу создать макрос, синтаксис которого примерно такой:

 SINGLE_CASE <Class Name> <Enum slot>  //add fields
ALL_SWITCH              //recognize all calling SINGLE_CASE (see below)

Ниже ожидаемое использование.

TopHeader.h: —

 SINGLE_CASE Machine slot1
SINGLE_CASE Machine slot2
//^-------- will be replaced by below code (generate the whole class)
template<class T> Sloter<Machine> : public GameObject {
public: int slot1;
public: int slot2;
};

SINGLE_CASE Turret slot3
//^-------- will be replaced by below code
template<class T> Sloter<Turret>  : public GameObject {
public: int slot3;
};

Manager.h: —

 class Manager{
enum SlotX{ slot1,slot2,slot3 };
public: int* provider(GameObject* gameObject, SlotX slotX){
switch(slotX){
ALL_SWITCH
//^---- will be replaced by below code (add only cases)
case slot1:{
return &(static_cast<Machine*>(gameObject)->slot1);
}break;
case slot2:{
return &(static_cast<Machine*>(gameObject)->slot2);
}break;
case slot3:{
return &(static_cast< Turret*>(gameObject)->slot3);
}break;
}
}
};

Это не очень хороший дизайн, но это простой пример MACRO может сделать что-то совокупный.

Эта функция полезна, когда я действительно хочу максимальной производительности и гибкости,
например сохранить индекс в самом члене для чрезвычайно быстрого hashMap.

Я прочитал :-

Я не уверен x-macros тег соответствующий.
(У меня ограниченные знания в этой области.)

Мой прогресс

#define SINGLE_CASE( ClassName, slotX) /
template<class T> Sloter<ClassName> : public GameObject { /
public: int slotX;  /
};

Я до сих пор не знаю, как заставить его поддерживать многих slot для того же класса или кода ALL_SWITCH,
Я рассматриваю определение некоторых видов таблиц в макросе, а затем заставляю другие макросы читать их. (невозможно?)

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]