본문으로 바로가기

C++17) if문과 switch문에서의 초기화

category C++/Modern 2019. 2. 23. 15:19

 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0305r0.html


C++ if 문에 대한 새로운 버전입니다.

이 if 문은 일반적인 코드 패턴을 단순화하고, 사용자가 범위를 엄격하게 유지하는데 도움을 줍니다.


1
2
3
4
5
6
7
8
9
10
 bool func() { ... }

    // C++17 이전                               // C++17 이후
    
    bool checktype = func();                if(bool checktype = func(); checktype == SUCCESS){
    if (checktype == SUCCESS) {
                                            {
    }                                        else
    else                                        ....
        ....
    
cs

새로운 형식의 if문은 많은 용도가 있습니다. 현재 이니셜라이저들은 if문 앞에 선언되고 스코프 내로 값이 유출됩니다.
새로운 형식을 사용하면 코드를 조금 더 적게 작성할 수 있으며 이전의 오류가 발생하기 쉬운 구조에서 조금 더 강력해 졌습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
std::map<intstd::string> mymap;
std::string key = "not";
int inputnum;
 
if (auto it = mymap.find(10); it == mymap.end()) { cout << "Not Found" << endl; }
// Not Found 출력
 
if (!(cin >> inputnum)) { static_assert(" ERROR "); }
// EOF만 아니라면 정상적으로 넘어감
 
if (auto keyword = { "if""for""while" };
    std::find(keyword.begin(), keyword.end(), key)){
    cout << "Not Found " << key << endl;
}// Not Found not 출력
cs

성공하지 못한 값을 버블링하는 '모나딕' 스타일은 더욱 간결하게 가능합니다.

1
2
3
4
5
6
7
8
9
status_code bar();
 
status_code foo()
{
    int n = get_value();
    if (status_code c = bar(n); c != status_code::SUCCESS) { return c; }
    if (status_code c = do_more_stuff(); c != status_code::SUCCESS) { return c; }
    return status_code::SUCCESS;
}
cs

모나드에 대한 정보 : https://stackoverflow.com/questions/39725190/monad-interface-in-c

for문, 그리고 새로 확장된 if문과 같이 switch문도 쉽게 작성할 수 있습니다.

1
2
3
4
5
6
    switch (Foo x = make_foo(); x.status()) {
    default/* ... */
    case Foo::FINE: /* ... */
    case Foo::GOOD: /* ... */
    case Foo::NEAT: /* ... */
    }
cs