微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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).请注意,可以在预处理器魔术本身内解决这个问题,但它使已经很难看的代码变得复杂.

原文地址:https://www.jb51.cc/c/118701.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐