我想创建一个神奇的宏,或任何东西,会产生这样的东西:
MAGICAL_MACRO(return_type,method_name,...)
应该像这样工作:
MAGICAL_MACRO(void,Foo,int a,int b)
– >
virtual void Foo(int a,int b) { _obj->Foo(a,b); }
这可能吗?恐怕不是.
解决方法
两个问题:您是否对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,Arg) BOOST_PP_TUPLE_ELEM(2,1,Arg) #define MAGICAL_MAKE_ARGUMENT(s,Arg)
用法如下:
MAGICAL_MACRO(void,(int,a),b))
宏定义中使用的%%只是表示“未使用此值”的方式.你可以在那里使用其他任何东西(除非它包含一个逗号).
只要涉及的类型没有用逗号拼写,上述解决方案就会起作用.如果是,请为它们引入类型别名(typedef或using).请注意,可以在预处理器魔术本身内解决这个问题,但它使已经很难看的代码变得复杂.