C++복습

C++복습) C++20/Concept

PJNull 2022. 1. 10.
728x90
반응형

concept

concept는 템플릿에 대한 특정 requirements(제약)에 이름을 붙이는 용도로 쓰인다. 

template<typename T>
void Test(T num){}

int main()
{
 Test(3);
 Test(3.14f);
}//T값에서 정수만 받고 싶다면 어떻게 해야되나?

위 코드가 있다고 할때 T에 대해서 조건을 붙이고 싶을때 사용하는 것이 바로 concept이라는 문법이다. 이러한 concept의 필요성은 대부분의 조건들은 런타임때 결정되지만 concept은 컴파일 단계에서 결정되기 때문에 프로그램의 성능을 향상시킬수 있다.

 

concept의 표현식

concept의 기본적인 구조는 requires std::조건<T>이며, 총4가지의 표현식이 존재한다.

 

1.Requires

기본적인 concept의 구조이며 template아래에 concept을 넣어준다.

template<typename T>
requires std::integral<T>
void Test(T num){}//T값을 정수로만 받음

 

2.Trailing Requires

Trailing은 ~을 붙이다의 의미가 있으며 함수 뒤에 concept을 붙이는 구조로 되어있다.

template<typename T>
void Test(T num)requires std::integral<T>{}

 

3.Constrained Template Parameter

template안에 concept을 넣는 방식이다.

template<std::integral T>
void Test(T num){}

 

4.Abbreviated Function Template

함수안에 concept을 넣는 방식이며, template대신 auto를 사용하고 있다.

void Test(std::integral auto number){}

 

concept의 종류

현재 C++에서는 다양한 concept의 조건들을 만들어놓았다.

 

1.언어관련

더보기
더보기

same_as

derived_from

convertible_to

common_reference_with

common_with

assignable_from

swappable

 

2.산술관련

더보기
더보기

integral

signed integral

unsigned_integral

floating_point

 

3.생명주기 관련

더보기
더보기

destructible

constructible_from

default_constructible

move_constructible

copy_constructible

 

4.비교관련

더보기
더보기

equality_comparable

totally_ordered

 

5.오브젝트관련

더보기
더보기

movable

copyable

semiregular

regular

 

6.호출관련

더보기
더보기

invocable

regular_invocable

predicate

 

7.반복자관련

더보기
더보기

input_iterator

output_iterator

forward_iterator

bidirectional_iterator

random_access_iterator

contiguous_iterator

 

8.알고리즘/범위 관련

더보기
더보기

permutable

mergeable

sortable

ranges::input_range

ranges::random_access_range

 

커스텀 컨셉

위의 concept들을 이용하여 기존의 표현식이 아닌 커스텀 컨셉을 만드는 것도 가능하다.

template<typename T>
concept MyConcept=!std::is_integral_v<T> && std::derived_from<T,GameObject>;
//int가 아니면서 GameObject타입이어야 한다.
template<typename T>
concept Addable=requires(T a,T b)
{
 a+b;
}//a+b가 가능해야함

template<typename T>
concept Equality=requires(T a,T b)
{
 {a==b}->std::convertible_to<bool>;
 {a!=b}->std::convertible_to<bool>;
}//==과 !=가 가능해야함

template<typename T>
concept Integral=std::is_integral_v<T>

template<typename T>
concept SignedInt=Integral<T>&&std::is_signed_v<T>;

 

728x90
반응형

'C++복습' 카테고리의 다른 글

C++복습) vector(동작원리)  (0) 2022.03.09
C++복습) C++20/Module  (0) 2022.02.04
C++복습) Modern C++/smart pointer  (0) 2022.01.03
C++복습) Modern C++/lambda  (0) 2021.12.30
C++복습) Modern C++/전달 참조  (0) 2021.12.30

댓글