Cha*_*l72 4 c++ c-preprocessor variadic-macros c++11
我正在使用包含一组预处理器库的库.其中一个是FOR_EACH样式宏,它迭代a __VA_ARGS__并为每个参数调用用户提供的宏.用户提供的宏称为:SOME_MACRO(current_arg)
但是,问题是它只适用于使用单个参数的用户提供的宏.我正在尝试做一些特殊的事情,它涉及struct结构中a 和每个字段的名称.问题是,这需要宏的两个参数.
由于我正在使用的库只接受一元宏,有没有办法将另一个参数"绑定"到我的宏?
截至目前,我必须在宏中硬编码结构的名称.所以,如果struct我正在与之合作Foo,我必须说:
#define MY_MACRO(FIELD) /* do something with &Foo::FIELD */
Run Code Online (Sandbox Code Playgroud)
有没有我可以"绑定"第二个STRUCT参数到宏,也许还有一些间接,所以当库调用我的宏时,它将能够扩展为:
#define MY_MACRO(FIELD) /* do something with &STRUCT::FIELD */
Run Code Online (Sandbox Code Playgroud)
是.您可以使用以下技术.
#define MY_MACRO(FIELD) EXPAND FIELD
#define EXPAND(X, FIELD) X::FIELD()
Run Code Online (Sandbox Code Playgroud)
用法在下面的测试代码中:
struct foo { static int f() { return 0; } };
struct STRUCT { static int f() { return 1; } };
#define MY_MACRO(FIELD) EXPAND FIELD
#define EXPAND(X, FIELD) X::FIELD()
int main ()
{
int i = MY_MACRO((STRUCT,f)); // see here braces inside braces
}
Run Code Online (Sandbox Code Playgroud)
上面的代码扩展到,
int main ()
{
int i = STRUCT::f();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |