C++宏只传递偶数变量参数

5uzkadbs  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(114)

是否可以创建一个ONLY_EVEN()宏来执行以下转换:

ONLY_EVEN0()
ONLY_EVEN2(a,b) b
ONLY_EVEN4(a,b,c,d) b,d

有任意数量的参数,使用可变参数宏参数?

zyfwsgd6

zyfwsgd61#

对于 * 无限 * 数量的参数可能不会。
然而,对于任意数量的参数,它是可能的,例如,下面是一个自包含的宏解决方案,可以在[0..6]中支持任意数量的参数,它可以用显而易见的方式扩展,以支持任意数量的参数。

#define ONLY_EVEN0(a) 
#define ONLY_EVEN1(a) 
#define ONLY_EVEN2(a,b) b
#define ONLY_EVEN3(a,b,c) b
#define ONLY_EVEN4(a,b,c,d) b,d
#define ONLY_EVEN5(a,b,c,d,e) b,d
#define ONLY_EVEN6(a,b,c,d,e,f) b,d,f
#define ONLY_EVEN_N(a,b,c,d,e,f,n,...) ONLY_EVEN##n
#define ONLY_EVEN(...) ONLY_EVEN_N(__VA_ARGS__,6,5,4,3,2,1,0)(__VA_ARGS__)

// example:
0: ONLY_EVEN()
1: ONLY_EVEN(A)
2: ONLY_EVEN(A,B)
3: ONLY_EVEN(A,B,C)
4: ONLY_EVEN(A,B,C,D)
5: ONLY_EVEN(A,B,C,D,E)
6: ONLY_EVEN(A,B,C,D,E,F)
$ g++ -std=c++11 -pedantic -E onlyeven.cpp | grep -v '#'
0:
1:
2: B
3: B
4: B,D
5: B,D
6: B,D,F

注意,根据C/C ++规范,预处理器最多只能接受256个参数。

相关问题