如何用C++预处理器宏自动生成模板函数前置声明
用C++预处理器自动生成模板函数前置声明
要实现修改max_dim后自动生成对应范围的模板函数前置声明,可以通过递归预处理器宏模拟循环逻辑,无需手动编写每个声明。
实现代码
// 定义最大维度,修改这个值即可自动调整生成的声明数量 #define max_dim 3 // 单个维度的前置声明模板 #define DECLARE_MATCH_ANY(DIM) template bool match_any<DIM>(); // 辅助宏:连接两个宏名称 #define CAT(A, B) CAT_INNER(A, B) #define CAT_INNER(A, B) A##B // 辅助宏:条件判断,COND为1时展开THEN,否则展开ELSE #define IF(COND, THEN, ELSE) _IF(COND, THEN, ELSE) #define _IF(COND, THEN, ELSE) CAT(_IF_, COND)(THEN, ELSE) #define _IF_0(THEN, ELSE) ELSE #define _IF_1(THEN, ELSE) THEN // 辅助宏:判断当前维度是否大于1(用于终止递归) #define IS_GREATER_THAN_1(DIM) CAT(IS_GREATER_THAN_1_, DIM) #define IS_GREATER_THAN_1_1 0 #define IS_GREATER_THAN_1_2 1 #define IS_GREATER_THAN_1_3 1 #define IS_GREATER_THAN_1_4 1 #define IS_GREATER_THAN_1_5 1 // 若max_dim需要更大的值,继续添加IS_GREATER_THAN_1_N的定义即可 // 递归生成声明的核心宏:从DIM递减到1,依次生成声明 #define GENERATE_DECLARATIONS(DIM) \ IF(IS_GREATER_THAN_1(DIM), GENERATE_DECLARATIONS(DIM-1), ) \ DECLARE_MATCH_ANY(DIM) // 触发生成所有声明 GENERATE_DECLARATIONS(max_dim)
工作原理
当max_dim=3时,预处理器会递归展开:
- 调用
GENERATE_DECLARATIONS(3),因3>1,先递归调用GENERATE_DECLARATIONS(2),再生成match_any<3>的声明。 - 调用
GENERATE_DECLARATIONS(2),因2>1,先递归调用GENERATE_DECLARATIONS(1),再生成match_any<2>的声明。 - 调用
GENERATE_DECLARATIONS(1),因1不大于1,直接生成match_any<1>的声明。
最终展开结果与手动编写完全一致:
template bool match_any<1>(); template bool match_any<2>(); template bool match_any<3>();
注意事项
- 纯标准C++预处理器无法动态计算数值,因此需要提前为
max_dim可能取到的所有数值定义对应的IS_GREATER_THAN_1_N宏。如果你的max_dim有固定上限(比如10),提前定义好这些宏即可满足需求。 - 如果需要支持更多模板函数,只需复制这套宏结构,修改
DECLARE_XXX和GENERATE_XXX的名称即可。
内容的提问来源于stack exchange,提问作者wittn
相关产品推荐
相关产品推荐

