如何定义宏 ( 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;
};
经理.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。
我读过了 :-
- 从 C++ 宏创建字符串列表和枚举列表
太简单了。 - 如何通过 C 预处理器 (cpp) 生成列表?
SINGLE_CASE
(FUNCTION_TABLE
在解决方案中)包含代码,而我的没有。
我不确定x-macros
标签是否合适。
(我在这方面的知识有限。)
我的进步
#define SINGLE_CASE( ClassName, slotX) /
template<class T> Sloter<ClassName> : public GameObject { /
public: int slotX; /
};
我仍然不知道如何使它支持许多slot
相同的类或代码ALL_SWITCH
。
我正在考虑在宏中定义某种表格,然后让其他宏读取它。(不可能?)