代码中实现内联替换的常用方法有哪些?
using 关键字的作用是定义类型别名、模板别名或者导入命名空间/类成员,无法实现你需要的表达式内联替换功能。除宏之外可以用以下几种更安全的方式实现需求:
constexpr 内联模板函数(C++11及以上支持)
这是宏的最佳替代方案,自带类型检查,不会出现宏的运算符优先级、参数重复计算等问题,开启优化后会完全内联展开,效率和宏完全一致:template <typename T> constexpr inline T clamp_sub_one(T var) { return (var - 1) > 0 ? (var - 1) : 0; }注意:你示例中的宏存在两个问题:一是语法错误,C++宏定义不需要加
as关键字;二是没有给参数加括号,如果传入a + b这类复合表达式会出现优先级错误,正确的宏写法为#define CLAMP_SUB_ONE(VAR) (((VAR) - 1) > 0 ? ((VAR) - 1) : 0)。即便修正后宏还是存在参数多次求值的问题(比如传入i++会导致i意外自增两次),更推荐使用上面的函数类方案。泛型lambda(C++14及以上支持)
如果需要更轻量化的写法,可以用constexpr泛型lambda,使用方式和宏一样便捷:constexpr auto clamp_sub_one = [](auto var) { return (var - 1) > 0 ? (var - 1) : 0; };基于标准库的实现(C++20及以上支持)
可以直接用std::max实现更易读的版本,标准库实现已经处理了各种边界情况:#include <algorithm> template <typename T> constexpr inline T clamp_sub_one(T var) { return std::max(var - 1, T{0}); }
内容的提问来源于stack exchange,提问作者jojo_Aero_smith_the_dummy
相关产品推荐
相关产品推荐

