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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...