我想创建一个神奇的宏,或任何东西,会产生这样的东西:
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).请注意,可以在预处理器魔术本身内解决这个问题,但它使已经很难看的代码变得复杂.
原文地址:https://www.jb51.cc/c/118701.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。