gpt4 book ai didi

c++ - 可以通过参数数量重载宏吗?

转载 作者:IT老高 更新时间:2023-10-28 14:01:53 29 4
gpt4 key购买 nike

this 怎么样?工作?如何实现 C99/C++11 可变参数宏以仅根据为其提供多少参数来扩展为不同的事物?

最佳答案

(编辑:见最后一个现成的解决方案。)

要获得一个重载的宏,首先我们需要一个在多个实现之间进行选择的宏。这部分不使用可变参数宏。然后一个通常计算其参数的可变参数宏产生一个选择器。将参数计数插入调度程序会产生一个重载的宏。

警告:该系统无法区分零个参数和一个参数,因为 没有参数和单个空参数之间没有区别。它们看起来都像 MACRO()


要在实现之间进行选择,请将宏连接运算符与一系列类似函数的宏一起使用。

#define select( selector, ... ) impl ## _ ## selector( __VA_ARGS__ )
#define impl_1() meh
#define impl_2( abc, xyz ) # abc "wizza" xyz()
//etc

// usage: select( 1 ) => impl_1() => meh
// select( 2, huz, bar ) => impl_2( huzza, bar ) => "huz" "wizza" bar()

因为 ## 运算符禁止对其参数进行宏扩展,所以最好将其包装在另一个宏中。

#define CAT( A, B ) A ## B
#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM )

要计算参数,请使用 __VA_ARGS__ 像这样移动参数(这是聪明的部分):

#define GET_COUNT( _1, _2, _3, _4, _5, _6 /* ad nauseam */, COUNT, ... ) COUNT
#define VA_SIZE( ... ) GET_COUNT( __VA_ARGS__, 6, 5, 4, 3, 2, 1 )

库代码:

#define CAT( A, B ) A ## B
#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM )

#define GET_COUNT( _1, _2, _3, _4, _5, _6 /* ad nauseam */, COUNT, ... ) COUNT
#define VA_SIZE( ... ) GET_COUNT( __VA_ARGS__, 6, 5, 4, 3, 2, 1 )

#define VA_SELECT( NAME, ... ) SELECT( NAME, VA_SIZE(__VA_ARGS__) )(__VA_ARGS__)

用法:

#define MY_OVERLOADED( ... ) VA_SELECT( MY_OVERLOADED, __VA_ARGS__ )
#define MY_OVERLOADED_1( X ) foo< X >
#define MY_OVERLOADED_2( X, Y ) bar< X >( Y )
#define MY_OVERLOADED_3( X, Y, Z ) bang_ ## X< Y >.Z()

关于c++ - 可以通过参数数量重载宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16683146/

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