gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:26:11 25 4
gpt4 key购买 nike

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

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吗?仅 header 库?

如果两个答案都是"is",我有一个解决方案给你:

#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)

用法看起来像这样:

MAGICAL_MACRO(void, Foo, (int, a), (int, b))

[Live example]

宏定义中使用的 %% 只是我表示“未使用此值”的方式。您几乎可以在那里使用任何其他内容(除非它包含逗号)。

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

关于C++ 或宏魔法来生成方法和转发参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44758329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com