如何用Boost预处理器自动生成宏的所有参数组合?
自动生成Boost预处理器宏的所有参数组合调用
兄弟,手动写8个参数的256种组合?这活儿谁干谁疯,Boost预处理器就是用来解决这种重复劳动的!我来给你一步步拆解怎么自动生成所有调用。
核心思路
每个参数是0/1二选一,本质上就是生成从0到2^N - 1的所有整数,把每个整数的二进制位作为宏的参数值(每一位对应一个参数的0或1)。Boost PP的BOOST_PP_BIT可以提取整数的指定二进制位,配合BOOST_PP_REPEAT_FROM_TO循环生成所有组合就行。
先从你的3参数示例入手
假设你的FOO宏和之前一样:
#include <boost/preprocessor/if.hpp> #define FOO(A,B,C) \ BOOST_PP_IF(A, a1, a2) \ BOOST_PP_IF(B, b1, b2) \ BOOST_PP_IF(C, c1, c2)
步骤1:引入必要的Boost PP头
#include <boost/preprocessor/repetition/repeat_from_to.hpp> #include <boost/preprocessor/bit.hpp>
步骤2:定义生成单个调用的宏
这个宏会把循环变量I的二进制位拆解成FOO的三个参数:
// I是循环变量,从0到7(2^3-1) #define GENERATE_FOO_CALL(I) \ FOO( \ BOOST_PP_BIT(I, 2), // 取I的第2位(最高位)作为A参数 BOOST_PP_BIT(I, 1), // 取第1位作为B参数 BOOST_PP_BIT(I, 0) // 取第0位(最低位)作为C参数 );
注意:
BOOST_PP_BIT(I, N)的N从0开始计数,所以如果你的参数顺序是A→B→C对应高位到低位,就按上面的写法;如果要反过来,调整位的序号就行。
步骤3:自动生成所有8种调用
用BOOST_PP_REPEAT_FROM_TO循环从0到8(左闭右开),调用上面的宏:
BOOST_PP_REPEAT_FROM_TO(0, 8, GENERATE_FOO_CALL, )
预处理器展开后,就会自动生成:
FOO(0,0,0); FOO(0,0,1); FOO(0,1,0); FOO(0,1,1); FOO(1,0,0); FOO(1,0,1); FOO(1,1,0); FOO(1,1,1);
扩展到8个参数的场景
8个参数需要生成256种组合,逻辑完全一样,只是调整位的数量和循环范围:
#define NUM_PARAMS 8 #define MAX_COMBINATIONS (1 << NUM_PARAMS) // 计算2^8=256 // 生成单个8参数的FOO调用 #define GENERATE_FOO_8PARAM(I) \ FOO( \ BOOST_PP_BIT(I,7), BOOST_PP_BIT(I,6), BOOST_PP_BIT(I,5), BOOST_PP_BIT(I,4), \ BOOST_PP_BIT(I,3), BOOST_PP_BIT(I,2), BOOST_PP_BIT(I,1), BOOST_PP_BIT(I,0) \ ); // 生成所有256种调用 BOOST_PP_REPEAT_FROM_TO(0, MAX_COMBINATIONS, GENERATE_FOO_8PARAM, )
适配你的Foo类构造函数场景
如果是要生成Foo类的构造函数调用,比如:
class Foo { public: Foo(int a, int b, int c); // 3参数构造,8参数的话同理扩展 };
直接修改生成宏,把FOO替换成构造逻辑就行,还可以用BOOST_PP_CAT生成唯一的变量名避免重复:
#define GENERATE_FOO_CTOR(I) \ Foo BOOST_PP_CAT(foo_, I)( \ BOOST_PP_IF(BOOST_PP_BIT(I,2), a1, a2), \ BOOST_PP_IF(BOOST_PP_BIT(I,1), b1, b2), \ BOOST_PP_IF(BOOST_PP_BIT(I,0), c1, c2) \ ); // 生成8个Foo对象,变量名是foo_0到foo_7 BOOST_PP_REPEAT_FROM_TO(0, 8, GENERATE_FOO_CTOR, )
注意事项
- 确保Boost PP的版本支持这些宏(大部分现代版本都没问题);
- 宏的换行必须用
\结尾,预处理器才会正确解析; - 如果参数的选择逻辑不是简单的0/1对应,只要把
BOOST_PP_BIT的结果替换成你的判断逻辑就行。
内容的提问来源于stack exchange,提问作者Caduchon
相关产品推荐
相关产品推荐

