Skip to content

if constexpr(C++17)

一句话

在模板中根据编译期条件选择性地编译某个分支,被丢弃的分支甚至不需要通过语法检查——编译期多态的利器。

头文件

无(语言特性)

核心 API 速查

语法形式说明
if constexpr (cond) { ... }condtrue,编译 then 分支
if constexpr (cond) { ... } else { ... }二选一编译
if constexpr (cond1) { ... } else if constexpr (cond2) { ... } else { ... }多分支链
if constexpr 搭配概念if constexpr (std::integral\<T\>) 类型特征判断
if constexpr 搭配 requires(C++20) 更推荐用 concepts 重载替代

最小示例

cpp
// Standard: C++17
#include <iostream>
#include <type_traits>

template <typename T>
auto print_type(const T& val) {
    if constexpr (std::is_integral_v<T>) {
        std::cout << "integral: " << val << "\n";
    } else if constexpr (std::is_floating_point_v<T>) {
        std::cout << "float: " << val << "\n";
    } else {
        std::cout << "other\n";
    }
}

int main() {
    print_type(42);     // integral: 42
    print_type(3.14);   // float: 3.14
    print_type("hi");   // other
}

嵌入式适用性:高

  • 零运行时开销:条件在编译期求值,不满足的分支完全不生成代码
  • 替代 SFINAE 和标签分派,大幅简化模板元编程的可读性
  • 适合根据硬件平台、外设类型等编译期常量选择不同代码路径
  • C++17 即可用,GCC 7+ 和 ARM Clang 6+ 均已支持

编译器支持

GCCClangMSVC
73.919.1

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建