用于生成方法和转发参数的C++或宏魔术

Ist*_*ády 7 c++ macros c++11

我想创建一个神奇的宏,或任何东西,会产生这样的东西:

MAGICAL_MACRO(return_type, method_name, ...)
Run Code Online (Sandbox Code Playgroud)

应该像这样工作:

MAGICAL_MACRO(void, Foo, int a, int b)
Run Code Online (Sandbox Code Playgroud)

- >

virtual void Foo(int a, int b) 
{
    _obj->Foo(a, b);
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?恐怕不是.

Rei*_*ica 5

两个问题:您是否对这些参数的语法略有不同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, 0, Arg) BOOST_PP_TUPLE_ELEM(2, 1, Arg)

#define MAGICAL_MAKE_ARGUMENT(s, Unused, Arg) \
  BOOST_PP_TUPLE_ELEM(2, 1, Arg)
Run Code Online (Sandbox Code Playgroud)

用法如下:

MAGICAL_MACRO(void, Foo, (int, a), (int, b))
Run Code Online (Sandbox Code Playgroud)

[实例]

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

只要所涉及的类型没有用逗号拼写,上述解决方案就会起作用.如果是,请为它们(typedefusing)引入类型别名.请注意,这可以解决这个预处理魔术本身,但它已经丑陋的代码复杂化.