You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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时,预处理器会递归展开:

  1. 调用GENERATE_DECLARATIONS(3),因3>1,先递归调用GENERATE_DECLARATIONS(2),再生成match_any<3>的声明。
  2. 调用GENERATE_DECLARATIONS(2),因2>1,先递归调用GENERATE_DECLARATIONS(1),再生成match_any<2>的声明。
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:15:32