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>& q, int val)
[[ expects: val > 0 ]] //사전조건
[[ ensures !q.empty() ]] //사후조건
{
q.push()
[[assert: q.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 a, int 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<int> iota(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이 확정되서 사용되기 시작하려면 좀 걸리겠지만,
모양새만 봐도 정말 많이 바뀌고 있다는 생각이 드는군요.