-
[C++] Concepts 의미와 사용 방법C++/C++ STL 2024. 9. 22. 10:03
Concepts 개요
Concepts는 C++20 표준에 처음 등장하였다. 템플릿 프로그래밍에서 제약 조건을 정의하는 기능을 한다. 이를 통해 특정 요구사항을 충족하는지, 컴파일 도중에 확인할 수 있다. 이를 통해, 템플릿을 더 명확하고 안전하게 작성할 수 있도록 도와준다.
Concepts 정의
Concepts는 Concept 키워드를 사용하여 정의된다. 특정 타입이 특정 요구 사항을 충족하는지 확인하기 위한 boolean 함수와 비슷한 역할을 한다.
// Concepts 정의 예제 template<typename T> concept EqualityComparable = requires(T a, T b){ {a == b} -> std::convertible_to<bool>; };위 예시에서 EqualityComparable이라는 Concept를 정의했다. 정의된 제약조건은 Concept는 템플릿 매개변수 T가 == 연산을 지원해야하고, 그 결과가 bool로 변환될 수 있어야 된다는 것이다.
Concepts 사용
Concept를 사용하여 타입을 제한하면, 그 타입에 제약에 충족하지 않을 경우, 컴파일러는 더 구체적이고 유용한 오류 메시지를 출력한다.
// 사용예제 1 template<EqualityComparable T> bool is_equal(const T& a, const T& b){ return a==b; }위 함수에서는 T가 앞서 정의한 EqualityComparable 제약을 만족하는지 확인한다. 즉, T의 타입이 == 연산을 지원하지 않으면 컴파일에 오류가 발생한다.
// 사용예제 2 template<typename T> requires EqualityComparable<T> bool is_equal(const T& a, const T& b){ return a == b; }또는 위 코드처럼, 템플릿 매개변수 T에 대해 EualityComparable 제약을 명시적으로 적용할 수 있다. 사용 예제 1과 동일한 기능을 갖는다.
// 사용 예제 3 template<typename T> concept Hashable = requires(T a){ { std::hash<T>{}(a) } -> std::convertible_to<std::size_t; }; template<typename T> concept ComparableAndHashable = EqualityComparable<T> && Hashable<T>;마지막으로 EqualityComparable과 Hashable를 동시에 만족하는 ComparableAndHashable이라는 복함 Concept를 정의하여 사용할 수도 있다.
* 해시 (Hash): 임의의 크기를 가진 데이터를 고정된 크기의 값 (해시 값)으로 변환하는 과정이다. 해시 함수는 데이터를 일정한 크기의 해시 값 또는 해시 코드로 변환하는 함수를 의미한다. 정수(int), 문자열(string)은 해시 가능하나, 사용자정의 구조체나, std::pair, std::tuple과 같은 복합적인 자료형에 대해서도 hash 적용이 불가하다.

C++ Concept 예시 코드 Concepts 장점
1. 가독성 향상: 템플릿 매개변수의 요구사항을 명확하게 기술할 수 있다
2. 컴파일 타임 오류 탐지: Concept를 사용하면, 잘못된 템플릿 매개변수로 인한 문제를 더 일찍 알 수 있다
3. 더 나은 오류 메시지: 오류 메시지를 더 구체적으로 제공한다.
'C++ > C++ STL' 카테고리의 다른 글
[C++] STL 컨테이너 멤버 타입 특징 (0) 2024.11.16