C++20

CJB_ny·2022년 12월 1일
0

C++20

목록 보기
1/1
post-thumbnail

4대

Concept

4대 중에 중요도가 그나마 떨어지는 애같음..

C#기준으로 이런 상속 구조를 만들고

C#의 Generic이라는 문법으로 조건을 T타입에 대해 조건을 걸어줄 수 있었음.

C++에는 이런 개념이 없었음.

3.14f 넣어주면은 "축소 변환" 일어남.

그래서

template 쓰면 이런게 가능했음.

그래서 이제 concept을 사용하면 C#처럼 where T : GameObject처럼 조건을 걸어줄 수 있는데

C#처럼 단순하지가 않고 사용방법이 4가지가 있다.

1. 방법 4가지

1) Requires Clause (절)

requires 키워드를 통해 요구조건을 붙여줄 수 있다.

Integral이라는 거 자체가 하나의 concept이다.

그러면 T에 어떠한 수든지다 받는게 아니라 "Integral : 정수"만 받아주겠다라는 요구사항이 생김.

2) Trailling Requires Clause (뒤에붙는)

3) Constrained Template Parameter (강요된)

4) Abbreviated Fuction Template

2. concept 종류

기본적인것들은 제공을 하는데 나중에 필요하면 필요한 요구사항에 따라 만들면된다.

3. concept 정의 , template

integral이 is_integral_v<_Ty>뭐 이딴식으로 되있는데, 이거 template과 관련된 부분임.

타고 들어가면 _is_any_of_v가 있는데

처음오는 type : int에 대해서 두번째 타입부터 int 타입이 있는지 없는지 봐서 있다면 true, 없다면 false를 반환하는 부분이다.

컴파일 타임때 결정이 되고, 함수는 런타임 중에 결정이됨.

실제로 실행하지 않고 보면은 true로 켜져있음.

그래서 concept이라는거 자체가 컴파일 타임에 결정이되는 것을 요구를 하는 것이다.

4. concept 종류

뭐 존나 많은데 다 외울거 아님.

다만 언어관련에서 deruved_from이게 C#의 where T : Player같은거임,

조금 유용한거는 반복자 관련에서 random_access_iterator

5. 구현 ❗❗❗

std::derived_from 사용을 해볼것이다.

C#이부분 처럼

이렇게 가능함.

std::derived_from < T는 Player로 부터 파생된 애들만 >

컴파일 문제없음.

6. concept 만들기 ❗❗

comcept이름을 MyConcept으로 만들것인데

조건이

!std::integral_v<t> && std::derived_from<T, GameObject>

이러한 concept이라는 뜻이고,

concept이름이 Addable이고, T a, T b가 '+'가 되어야 한다는 concept이다.

unsigned int concept만들 수 있음.

Module

C++20에서 역대급으로 중요함 ❗

C++ 단점 1. 문법 어렵고 2. 빌드 속도 오래걸림

모듈이라는거 사용하면 빌드 속도 개빨라짐.

이게 기존의 방식이다.

.cpp파일 개별적으로 빌드를 하기때문에 용량이 늘어난다.

예를들어 c++20.cpp에서 #include < iostream > 하고

다른 .cpp에서도 #include < iostream > 를 막 할 경우.

즉, 불필요하게 반복적으로 빌드를 하는게 치명적인 단점이다.

삼볼 중복 정의는 헤더에다가 함수 선언하고 정의할 경우

링킹 단계에서 중복 정의가 일어나는 문제 말하는거임.

아무튼 이런 복잡하고 어려운 문제를 "모듈"쓰면 한벙에 다 처리가 가능함.

1. Module 사용

딱 한번만 import된다.

inport 순서 상관없음

심볼 중복 정의 가능

모듈의 이름도 지정가능

인터페이스/구현부 분리 관리할 필요 없음.

미래의 C++이 C#처럼 갈 수도 있다.

이렇게 만들어주고

만들어줌.

사용은 어케하냐?

뭐 이렇게 함수 사용하듯이 하면은 됨.

2. module 사용 방법

이런방식으로 export로 묶어서 사용하고

namespace를 사용하는 방법도 있다.

실제로 사용을 할 경우에는

이렇게 사용을 해준다.

3. Module 내부에서 다른 헤더파일 추가시

export module Math이전에 사진과 같이

module;

"원하는 헤더파일" 를 해주면된다.

3번방식을 사용하는게 권장되는 방식이다.

4. module 쪼개서 관리하기 submodule

하나의 module파일안에 싹다 때려박아 넣으면 복잡함.

그래서 math에서도 time과 관련된 부분들을 math.time이라는 모듈로 따로 빼서 관리가 가능하다.

모듈파일을 이렇게 나누고

이렇게 만들어주면은 math.에 속한 time이라는 느낌을 줄 수 있다.

사용을 할 때는 이렇게 import하면 되는데 이것도 귀찮다. 한방에 import하고 싶다!

=> math 모듈에서

11번째줄 처럼 import하자마자 export해주면된다.

이런 모듈을 submodule이라고 한다 (math.time같은 애들)

5. Fragment방식

파일 만들고

이런방식으로 사용을 한다.

submodule과는 다르게 MathParition_1을 독립적으로 사용을 못한다.

한번에 다 사용해야함.

10번째줄 처럼 안됨.

Range

C#의 LINQ 문법이랑 비슷하다?

이렇게 하는거는 old한 방식이고

이렇게 사용하는것을 권장을 함.

이런식으로 사용가능함.

먼저 조건을 filter해가지고 조건에 해당하는 애들만 transform 변환 시킨다.

1. Range, Views

종류는

이렇게 존나 많음.

std::views::take(3)로 3개만 추출도 씹가능.

2. Ranges, Views 활용

vector대상으로 할 경우

map을 대상으로 할 경우

추가 조건도 더 넣을 수 있음

3. 응용 std::views::iota(a, b)

a 부터 시작해서 1씩 증가 b개를 만들어줌.

4. 정리

다른거는 모르겠고

이런 부분들을 최소

std::remove_if, std::remove, std:foreach를 통해서 처리를 하든가

이렇게 ranges문법을 통해서 처리를 하도록 하자.

Coroutine

유니티에서만 코루틴있는거 아님

C#에 있는 코루틴 문법을 유니티에서 적극적으로 채용해서 제공을 하는거임.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글