C或宏魔法生成方法和转发参数

前端之家收集整理的这篇文章主要介绍了C或宏魔法生成方法和转发参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想创建一个神奇的宏,或任何东西,会产生这样的东西:
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))

[Live example]

宏定义中使用的%%只是表示“未使用此值”的方式.你可以在那里使用其他任何东西(除非它包含一个逗号).

只要涉及的类型没有用逗号拼写,上述解决方案就会起作用.如果是,请为它们引入类型别名(typedef或using).请注意,可以在预处理器魔术本身内解决这个问题,但它使已经很难看的代码变得复杂.

猜你在找的C&C++相关文章