我想创建一个神奇的宏,或任何东西,会产生这样的东西:
MAGICAL_MACRO(return_type, method_name, ...)
Run Code Online (Sandbox Code Playgroud)
应该像这样工作:
MAGICAL_MACRO(void, Foo, int a, int b)
Run Code Online (Sandbox Code Playgroud)
- >
virtual void Foo(int a, int b)
{
_obj->Foo(a, b);
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?恐怕不是.
两个问题:您是否对这些参数的语法略有不同MAGIC_MACRO
?你可以使用Boost.Preprocessor仅头文件库吗?
如果两个答案都是"是",我有一个解决方案:
#define MAGICAL_MACRO(Type, Name, ...) \
virtual Type Name(MAGICAL_GENERATE_PARAMETERS(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))) {\
_obj->Name(MAGICAL_GENERATE_ARGUMENTS(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))); \
}
#define MAGICAL_GENERATE_PARAMETERS(Args) \
BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(MAGICAL_MAKE_PARAMETER, %%, Args))
#define MAGICAL_GENERATE_ARGUMENTS(Args) \
BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(MAGICAL_MAKE_ARGUMENT, %%, Args))
#define MAGICAL_MAKE_PARAMETER(s, Unused, Arg) \
BOOST_PP_TUPLE_ELEM(2, 0, Arg) BOOST_PP_TUPLE_ELEM(2, 1, Arg)
#define MAGICAL_MAKE_ARGUMENT(s, Unused, Arg) \
BOOST_PP_TUPLE_ELEM(2, 1, Arg)
Run Code Online (Sandbox Code Playgroud)
用法如下:
MAGICAL_MACRO(void, Foo, (int, a), (int, b))
Run Code Online (Sandbox Code Playgroud)
在%%
宏定义中使用的只是我的指示方式"不使用此值." 你可以在那里使用其他任何东西(除非它包含一个逗号).
只要所涉及的类型没有用逗号拼写,上述解决方案就会起作用.如果是,请为它们(typedef
或using
)引入类型别名.请注意,这是可以解决这个预处理魔术本身,但它已经丑陋的代码复杂化.
归档时间: |
|
查看次数: |
1681 次 |
最近记录: |