一个#macro添加一个字段和一个案例(在switch-case中)

时间:2017-02-22 05:27:47

标签: c++ c++11 macros x-macros

如何定义宏(ALL_SWITCH)以将另一个宏(SINGLE_CASE)出现识别为列表,并将代码插入两个不同的位置?

有可能吗?

实施例

我想创建一个语法大致相似的宏: -

 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是否可以做聚合

当我真正想要最终的性能和灵活性时,此功能非常有用 例如store index into member itself for extremely-fast hashMap

我看过:

我不确定x-macros标签是否合适 (我对这方面的知识有限。)

我的进步

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

我仍然不知道如何为同一个班级或代码slot支持多个ALL_SWITCH
我正在考虑在宏中定义某些类型的表,然后让其他宏读取它。 (不可能?)

0 个答案:

没有答案