---C++ 역량 강화---/STL 공부

[c++20] concept

코리아탑클 2024. 6. 6. 12:20

[[[type traits와의 차이]]]

둘 다 컴파일 타임에서 조건을 주고, 조건에 따라 코드를 조작한다는 점이 비슷하다고 생각해서 찾아봤다.

type traits는 받아온 인자의 타입을 가지고 컴파일 타임에서 코드를 조작하고 생성 변경 등을 하는 것이 목적이다.

concept는 템플릿변수에 대한 제약조건을 만든다.

또한 여러 함수들을 오버로딩 해놓는데, 인자로 들어온 매개 변수들은 만들어놓은 제약 조건에 따라서 알맞는  함수가 호출된다.

1. 템플릿 매개변수의 타입에 제약 조건을 건다.

2. 제약 조건에 따른 함수가 호출될 수 있도록 오버로딩 한다.

3. 컴파일 타임에서 concept을 검사하여 의도에 맞지 않으면 빨간줄을 그어준다.

오류를 친절히 알려준다.

 

==중요==

type traits 없이는 concept를 만들 수 없다.

concept를 만들 때 type traits를 가지고서 만든다.

type traits로 concept를 만드는 이유는 더 편하게 사용하기 위해서다.

 

[[[type traits 간단히 복습]]]

1. is_same_v<>같은 템플릿 함수를 type traits라고 하며 메타 프로그래밍에서 타입을 비교 변경 조작 생성 결정 등을 할 수 있다.

2. is_same, is_integer, is_remove등의 type traits를 사용하면 타입이 같은지, 정수형인지, 타입에서 참조를 제거하는지 등을 확인하고 변환할 수 있다.

3. 중요한건 컴파일 시점에 변환한다는 것이고 if constexpr 선택적 컴파일을 통해 필요에 맞는 소스코드를 기계어로 만들 수 있다. 

4. 사용 방법은 template<class T> if constexpr (is_integer_v<T>){} else{} 이 구조를 사용한다.

맞다면 if를 컴파일, 아니라면 else를 컴파일 한다.

https://koreatopclass.tistory.com/31

https://koreatopclass.tistory.com/32

 

[[[concept]]]

==헤더==

#include <concepts>

 

c++20에서 추가 된 개념이다.

1. 템플릿 매개 변수로 전달된 자료형이 원하는 자료형이 맞는지 알 수 있다.

2. 자료형의 특성에 따라서 적절한 함수를 호출해 줄 수 있다.

즉 자료형에 따라 함수들을 오버 로딩 해놓는 것이다.

3. type traits처럼 컴파일 타임에서 조건을 검사할 수 있도록 구현되었다.

템플릿 변수에 제약 조건을 걸어 놨다.

인자를 받으면 조건 검사 후 알맞는 함수에 전달된다.

class 대신에 실수, 정수를 넣었는데, 전체 class를 받지 않고 실수 class, 정수 class를 받겠다 라는 의미다.

c++20 concept dispatching 이라고 한다.

디스 패칭 방법은 태그 디스패칭, SFINAE, concept 디스패칭이 있다.

|| 기호를 사용해서 한번에 묶는 방법이다.

전체 클레스를 받는 "class"(typename)를 사용하지 않고 정수와 실수 클래스만 받는 "타입"을 사용할 것이다!

문자열은 조건에 지정되어 있지 않으므로 알맞는 함수를 찾을 수 없다.

즉, 나는 template 함수를 만들건데, 정수와 실수만 인자로 받는 함수를 만들것이다!! 

이라고 템플릿 매개 변수 타입에 제약 조건을 거는 것이다.

 

학습 장소: 한국공학대학교 게임공학과 수업

참고: https://en.cppreference.com/w/

'---C++ 역량 강화--- > STL 공부' 카테고리의 다른 글

[c++20] ranges, view  (0) 2024.06.07
사용자 정의 리터럴 접미사  (0) 2024.06.06
템플릿 메타프로그래밍  (0) 2024.06.06
distance  (0) 2024.06.04
copy  (0) 2024.06.04