【发布时间】:2013-03-28 16:32:57
【问题描述】:
我正在试验 C++11 variadac 宏。
我试图对列表中的每个参数应用另一个宏。
这是我的第一次尝试:
#define APPLY_CHAIN(first, ...) APPLY_ACT(first) APPLY_CHAIN( __VA_ARGS__ )
不幸的是,这不起作用。
我最终让它工作了。但它有点令人费解,并且有一个 'n' 的限制(其中 'n' 是我愿意为其键入宏的最大大小)。
#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
#define COUNT(...) COUNT_N( __VA_ARGS__, 10, 9, 8, 7, 6, 5 ,4, 3, 2, 1)
#define BUILD_CHAIN_1(_1) APPLY_ACT(_1)
#define BUILD_CHAIN_2(_1, ...) APPLY_ACT(_1) BUILD_CHAIN_1(__VA_ARGS__)
#define BUILD_CHAIN_3(_1, ...) APPLY_ACT(_1) BUILD_CHAIN_2(__VA_ARGS__)
#define BUILD_CHAIN_4(_1, ...) APPLY_ACT(_1) BUILD_CHAIN_3(__VA_ARGS__)
#define BUILD_CHAIN_5(_1, ...) APPLY_ACT(_1) BUILD_CHAIN_4(__VA_ARGS__)
#define BUILD_CHAIN_6(_1, ...) APPLY_ACT(_1) BUILD_CHAIN_5(__VA_ARGS__)
#define BUILD_CHAIN_7(_1, ...) APPLY_ACT(_1) BUILD_CHAIN_6(__VA_ARGS__)
#define BUILD_CHAIN_8(_1, ...) APPLY_ACT(_1) BUILD_CHAIN_7(__VA_ARGS__)
#define BUILD_CHAIN_9(_1, ...) APPLY_ACT(_1) BUILD_CHAIN_8(__VA_ARGS__)
#define BUILD_CHAIN_10(_1,...) APPLY_ACT(_1) BUILD_CHAIN_9(__VA_ARGS__)
#define BUILD_CHAIN_INC( CT, ...) BUILD_CHAIN_ ## CT (__VA_ARGS__)
#define BUILD_CHAIN( CT, ...) BUILD_CHAIN_INC(CT, __VA_ARGS__)
#define APPLY_CHAIN(...) BUILD_CHAIN( COUNT(__VA_ARGS__), __VA_ARGS__)
#define APPLY_ACT(X) #X
#include <iostream>
int main()
{
std::cout << APPLY_CHAIN(1,2,3,4,5) << "\n";
}
所以我的问题是:我是否遗漏了一些简单的东西,可以让我在参数链中使用iterate?
【问题讨论】:
标签: c++ c++11 c-preprocessor variadic-macros