article thumbnail image
Published 2022. 9. 17. 19:13
  • C++20에는 여러가지 개선사항이 추가되었다. 그중에서 concept를 소개하고자한다. 하지만 먼저, concept가 나온 배경이 무엇이지 알아보자.
    1. C++에는 Narrowing Conversion과 Integral Promotion이 있다. 데이터 전달과정에서 double이나 float형의 변수가 int형으로 Conversion이 일어나면, accuracy에서 손해를 봐야했으며, 반대로 bool 타입의 변수가 int로 Promotion이 일어나기도 했다. 이러한 문제로 인해서, 함수 템플릿을 작성할 때, 특정 타입에 대해서, 하나하나 Specilization 함수를 작성해야 했다.  
    2. std::sort는 정렬 알고리즘이며, random access iterator를 사용하여 컨테이너의 원소들을 정렬한다.  반면에 컨테이너인 std::list는 bidirectional iterator를 사용한다. 이때, std::list를 std::sort를 사용하여 정렬을 시도하려고 하면, 컴파일러는 bunch of 에러를 출력한다. C++ 개발에 참여한 개발자가 아니면, 이러한 에러들을 인지하고 대응할 수없다.
  • Concept를 사용하는 방법
    • Requires clause : 템플릿 파라미터를 선언하고, 바로뒤에 requires 구문을 선언하는 방법
    • Trailing requires clause : Requires clause와 동일하나, 함수 이름뒤에 requires 구문은 선언함
    • Constrained template parameter : 템플릿 파라미터 T 자체를 concept로 선언하는 방법
    • Abbreviated function template : 함수 파라미터 자체를 concept로 선언하는 방법
/*
template < class T >
concept std::integral = std::is_integral_v<T>;
라는 점에 주의하고,
gcd(최대공약수)를 반환하는 함수를 구현해보자
*/

//1. Requires clause
template <typename T> requires std::integral<T>
auto gcd(T a, T b){
	if(b == 0) return a;
	else return gcd(b, a % b);

}

//2. Trailing requires clause
template <typename T>
auto gcd1(T a, T b) requires std::integral<T> {
	if(b == 0) return a;
	else return gcd1(b, a % b);
}

//3. Constrained template parameter
template <std::integral T>
auto gcd2(T a, T b){
	if(b == 0) return a;
	else return gcd2(b, a % b);

}

//4. Abbreviated function template
auto gcd3(std::integral auto a, std::integral auto b){
	if(b == 0) return a;
	else return gcd3(b, a % b);

}

 

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

[C++] Iterator, 반복자  (1) 2022.09.19
[C++14] Virtual Inheritance  (0) 2022.09.18
값 카테고리, 타입 카테고리  (0) 2022.07.04
Type Category Testing_2(형 카 검-컴포지트 타입)  (0) 2022.07.04
Template 가이드라인  (0) 2022.07.04
복사했습니다!