if constexpr 与常量表达式: 编译时的“如果“【仓鼠学CPP17】

前言

if,条件语句,可以说是众所周知的东西了。但在cpp-17里,又推出了一个“if constexpr”,同样是表示比较。两者区别在于:if是在运行时比较,而if constexpr,是在编译器里比较。一个程序,编译只要一遍,实际运行则可能会跑很多次,因此,在对于一些能在编译器里所确定的内容,使用if constexpr 是一个好主意!当然,大部分内容是不会就在编译器的时候就确定的,因此,其使用有局限性,主要展示在两个下述用例中。

本文所用编译指令如下(exprlearn.cpp为代码位置),就是正常的cpp指令

g++ -std=c++17 -o experprogram exprlearn.cpp
./experprogram

用例一:模板编程(template)

#include 
#include  //这个库包含检验template的工具

template 
void print_type(T t) {
    if constexpr (std::is_integral_v) { //整数
        std::cout << "Integer: " << t << std::endl;
    } else if constexpr (std::is_floating_point_v) { //浮点数
        std::cout << "Floating point: " << t << std::endl;
    } else {  //其它
        std::cout << "Other type" << std::endl;
    }
}

int main() {
    //以下为例子
    //因为模版具体什么类型是编译时就可以获取的信息
    //因此相当于编译时就可以作为这些判断,运行直接运行
    print_type(42);       
    print_type(3.14);     
    return 0;
}
Integer: 42
Floating point: 3.14

用例二:常量表达式(constexpr 修饰)

constexpr本身是源于cpp11,简单来讲就是:

1.修饰变量:意味着该变量是一个常量,并且其值必须在编译时确定

2:修饰函数:意味该函数的返回值可以在编译时计算。constexpr 函数不能包含需要运行时计算的部分(如动态分配内存乃至普通的变量)。

相关举例:

#include 

constexpr bool is_debug = true;  // 常量表达式


void print_value(int value) {
    if constexpr (is_debug) {  // 编译时常量表达式条件判断
        std::cout << "Debug mode: ";
    } else {
        std::cout << "Release mode: ";
    }
    
    std::cout << value << std::endl;
}

int main() {
    print_value(42);  // 输出 Debug mode: 42
    return 0;
}

输出 

Debug mode: 42

 

 

 

你可能感兴趣的:(cpp17,c++,macos,面试,visual,studio,code,学习)