ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.