postgame

신박한 c++20 2/2

review/major 2020. 12. 17. 12:07

5. Designated initializers

 

20에서는 생성과 동시에 값 대입이 더욱 쉬워졌습니다.

------------------------

#include <iostream>

using namespace std;

 

struct A {

    int x;

    int y;

    int z;

};

 

int main()

{

    A a1{ .x = 3, .y = 5, .z = 4 };

    getchar();

}

------------------------

 

일부 멤버변수 빼고 해도 됩니다.

------------------------

int main()

{

    A a1{ .x = 3, .z = 4 };

    getchar();

}

------------------------

 

다만 순서가 틀리면 빌드가 되지 않습니다.

------------------------

int main()

{

    A a1{ .z = 3, .x = 4 };  <-- 에러

    getchar();

}

------------------------

 

뭔가 대단한 기능은 아니지만, 

c++도 문법 슈가를 꾸준히 개선중인 것으로 보입니다.

 

6. Contracts

 

우리는 버그를 찾기 위해 assert를 사용합니다.

------------------------

void foo(int i)

{

    assert(i > 10);

}

------------------------

 

11에선 컴파일 타임에서 사용되는 static_assert도 추가됬는데,

20에서는 함수 사전조건과 사후조건을 체크할 수 있는 문법이 검토중입니다.

 

------------------------

auto push(queue<int>& qint val

  [[ expectsval > 0 ]]  //사전조건

  [[ ensures !q.empty() ]] //사후조건

  { 

      q.push()

  [[assertq.size() > 2]]    //assert 

    return q.size();

}

------------------------

요건 아직 vs에서 컴파일은 되지 않아요.

 

7. Ranges 라이브러리 추가

 

20부터는 ranges라이브러리가 도입되서 좀더 간결한 사용이 가능해졌어요.

 

------------------------

using namespace ranges;

vector<int> v = view::iota(0,10);   //v를 0으로 10개를 채워라

------------------------

 

자바의 stream처럼 함수형 기차길도 만들수 있습니다.

 

-----------------------

auto sq = [](int n) { return n*n;};

std::vector<int> v = view::iota(0,10) | view::transform(sq);

-----------------------

 

좀더 복잡한 예제

-----------------------

vector<int> v = 

    view::iota(0,15) |          //0으로 15개를 채워서

    view::group_by(quotient) |  //quotient 함수로 그룹을 나눈후

    view::transform(sum);       //sum함수로 변환해 v를 돌려줘라

 

auto quotient = [](int aint b){

    return a/5 == b/5;

}    

auto sum = [](auto rng){

    return ranges::accumulate(rang, 0);

}

-----------------------

 

여기저기 찾아보면 vs에서 nuget으로 clang을 설치하고 컴파일하면 된다는 이야기는 있는데, 

제가 해본 봐론 안됩니다. --;;

하지만 요런 모양이 된다는 점은 알수가 있죠.

 

8.코루틴

 

드디어 c++에서도 코루틴이 들어왔습니다.

유니티에서 코루틴이 쓰이지 시작하면서 

코루틴은 더이상 새삼스러운 기능은 아닙니다.

다만, c++20에서 정식 문법으로 편입되기 시작한거죠.

 

-----------------------

auto example(){

    puts("step 1");

    co_await std::experimental::suspend_never();

    puts("step 2");

}

 

int main()

{

    example();

    puts("step 3");

    getchar();

}

---------------------

 

두둥... 우리가 익히 알고있는 그 코루틴이 되겠습니다.

물론 리턴값이 있는 yield도 있습니다.

 

--------------------

generator<intiota(int n = 0) {

  while(true)

    co_yield n++;

}

--------------------

 

요것도 아직까진 vs에서 빌드되진 않습니다.

 

그외

 

8.reflection 

c++에서도 리플릭션이 표준스펙으로 들어온답니다.

9.Networking TS

Boost.ASIO기반으로 소켓 라이브러리가 추가된다고 합니다. 이제야?

10. parallelism ts v2

java는 8에서 이미 도입된 병렬처리가 표준 문법으로 편입. 여러모로 c++도 열심히 따라가고 있어요.

 

그외 왕창 더 있습니다만, 걍 마음대로 골라봤습니다.

물론 아직 20이 확정되서 사용되기 시작하려면 좀 걸리겠지만,

모양새만 봐도 정말 많이 바뀌고 있다는 생각이 드는군요.

 

Posted by totori_