C++17(2) : if 与 switch 在语句中的初始化

1、if 初始化

//初始化作用域开始
if(int i = 10; true){
    std::cout << "true " << i << std::endl;
}
else{
    std::cout << "false " << i << std::endl;
}
//初始化作用域结束

 

2、switch 初始化

//我的编译器是clang 7 filesystem的名字空间如下。不同的编译器不太相同。
    using namespace std::experimental::filesystem;
//    using namespace std::filesystem;
    const std::string path_name = "../../if_switch_with_initialization";

    switch (path p(path_name); status(p).type()) {
        case file_type::not_found :
            std::cout << p << " not found" << std::endl;
            break;
        case file_type::directory:
            std::cout << p << " :\n";
            for(auto& e : directory_iterator(p)){
                std::cout << "-" << e.path() << std::endl;
            }
            break;

        default:
            std::cout << p << " exists\n";
            break;
    }

 

3、用处

  a、模板参数类型推断

std::mutex mutex;
{
    //C++17 之前
    std::lock_guard lock_guard(mutex);
}

{
    //c++17
    std::lock_guard lock_guard1(mutex);
}

  b、锁与if 初始化

if(std::lock_guard lg(some_mutex); !some_struct.empty()){
    std::cout << some_struct.front() << std::endl;
}

//上面这段代码等同于下面这段代码
{
    std::lock_guard lock_guard(some_mutex);
    if(!some_struct.empty()){
        std::cout << some_struct.front() << std::endl;
    }
}

 

    注意。在初始化时一定要给一个名字,尽管你不会用到,但是如果不给名字,则其作用域仅仅维持到初始化结束。

if(std::lock_guard{some_mutex};//锁的作用域开始-结束
    !some_struct.empty()){                          //没有被锁住
    std::cout << some_struct.front() << std::endl;  //没有被锁住
}

 

    一种有人喜欢有人讨厌的写法,初始化的名字为"_"。

if(std::lock_guard _{some_mutex};
    !some_struct.empty()){
    std::cout << some_struct.front() << std::endl;
}

  c、map 与if 初始化

std::map map;

{
    //C++17之前
    auto ret = map.insert({"new", 42});
    if(!ret.second){
        const auto& elem = *(ret.first);
        std::cout << "already there : " << elem.first << std::endl;
    }
}

{
    //C++17
    if(const auto& [pos, ok] = map.insert({"new", 42}); !ok){
        const auto& [key, value] = *pos;
        std::cout << "already there : " << key << std::endl;
    }
}

 

4、工程源码

    https://github.com/polizi/Cpp17

 

 

你可能感兴趣的:(C++)