C++普通函数与模板非类型参数版本函数的代码复用问题问询
实现方案
有两种常用的无额外开销的代码复用方案:
方案1:模板版本直接调用普通函数实现
编译器开启优化后会对常量参数做常量折叠,完全不会产生额外运行时开销,实现成本最低:
// 公共实现,仅需维护这一份逻辑 int square(int i) { return i * i; } // 模板版本直接复用普通函数逻辑 template<int i> int square() { return square(i); }
方案2:C++17及以上用constexpr公共实现
如果需要同时支持编译期常量计算和运行期动态参数计算,可以把核心逻辑抽成constexpr实现,两边都调用:
// 公共核心逻辑,同时支持编译期和运行期调用 constexpr int square_impl(int i) { return i * i; } // 运行时参数版本 int square(int i) { return square_impl(i); } // 非类型模板参数版本 template<int i> int square() { return square_impl(i); }
如果你的使用场景没有强制要求保留模板版本的接口形式,甚至可以直接只保留constexpr int square(int i)这一个函数:当传入参数是编译期常量时,编译器会自动在编译阶段完成计算,和非类型模板参数版本的效果完全一致。
内容的提问来源于stack exchange,提问作者Alexander Torstling
相关产品推荐
相关产品推荐

