在类名列表上迭代预处理器宏

Lar*_*rxX 1 c++ macros

我想在类名列表上运行宏以避免复制/粘贴错误和麻烦.

想象一下,作为一个简单的例子,SDK中的每个类都需要在使用之前调用静态分配方法.因此,每次添加新类时,我都必须在初始化时手动添加以下行:

MyNewClass::allocate();
Run Code Online (Sandbox Code Playgroud)

我还需要为初始化和销毁​​做同样的事情.

所以,不是每次都手动执行此操作,我想知道是否有办法在某处编写所有类名的列表,然后定义一个宏来为列表中的每个类调用相应的方法.有些东西:

#define ALLOCATE( TheClass ) TheClass ## ::allocate();
Run Code Online (Sandbox Code Playgroud)

但是TheClass我不想仅仅作为参数传递,而是要传递我的类列表.所以致电:

ALLOCATE_ALL( ClassA, ClassB, ClassC )
Run Code Online (Sandbox Code Playgroud)

它会扩展到:

ClassA::allocate();
ClassB::allocate();
ClassC::allocate();
Run Code Online (Sandbox Code Playgroud)

最后,我希望能够定义一个类列表并让多个宏迭代它.有些东西:

ALLOCATE_ALL( MyClassList )
INIT_ALL( MyClassList )
DESTROY_ALL( MyClassList )
Run Code Online (Sandbox Code Playgroud)

我已经看过可变参数宏,但是,如果我理解正确的概念,你必须定义尽可能多的宏作为参数的最终数量; 在我的情况下,这根本不可行.

这有可能吗?

感谢您的任何帮助和/或反馈.

Lin*_*cer 10

如果您对拥有一个类列表感到满意,可以使用以下技巧:

#define MY_CLASSES X(ClassA) X(ClassB) X(ClassC)
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

#define X(a) a::allocate();
MY_CLASSES
#undef X
Run Code Online (Sandbox Code Playgroud)

要做其他事情,你可以这样做:

#define X(a) a::init();
MY_CLASSES
#undef X
Run Code Online (Sandbox Code Playgroud)

  • 这是 [X-macros](http://stackoverflow.com/questions/6635851/real-world-use-of-x-macros) 方法。如果您不喜欢之后执行“#undef”,则可以将“MY_CLASSES”的内容放入“#include”的文件中(不包含包含保护),而不是使用“MY_CLASSES”。在此文件的末尾,您可以放置​​“#undef X”。 (2认同)