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.산술관련
3.생명주기 관련
4.비교관련
5.오브젝트관련
6.호출관련
7.반복자관련
input_iterator
output_iterator
forward_iterator
bidirectional_iterator
random_access_iterator
contiguous_iterator
8.알고리즘/범위 관련
커스텀 컨셉
위의 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>;
'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 |
댓글