C++공부/C++ Templates

부록 E. 개념

아헿헿헿 2022. 7. 8. 04:44

개념이란 하나나 그 이상의 파라미터에 대한 제약 조건에 대해 이름을 붙인 것입니다.

E.1 개념 사용

template<typename T> requires LessThanComparable<T>
T max(T a, T b) {
  return b < a? a: b;
};

requires절을 통해 뒤의 불리언 조건자로 상수 표현식에 평가되는 LessThanComparable을 사용하여 이 결과가 참일 경우에만 인스턴스화되도록 합니다. 요구 절을 개념으로 표현하지 않아도 되고 어떠한 불리언 상수 표현식이라도 됩니다. 이는 && 혹은 ||을 통해 여러 조건을 조합할 수도 있습니다. 또한 다음과 같이 제약 조건을 약식으로 사용하는 것도 가능합니다.

template<LessThanComparable T>
T max(T a, T b) {
  return b < a? a: b;
};

E.2 개념 정의

개념은 bool 형식의 constexpr 변수 템플릿과 거의 같지만 형식이 명시되지는 않습니다.

template<typename T>
concept LessThanComparable = requires(T x, T y) {
  { x < y } -> bool
};

요구 표현식에서 부가적인 파라미터 목록을 더 받을 수도 있으며, 요구 사항 {x < y} -> bool은 안의 조건이 SIFNAE 법칙에 유효해야만 하며 그 결과가 bool로 표현될 수 있어야한다는 뜻입니다. 표현식의 유효성만을 본다면, 중괄호와 bool을 뺄수도 있습니다. typename type;의 형식이 사용된다면 이는 type이 존재해야만 한다는 의미 입니다. 또한 요구 표현식 내에 요구 절을 추가할 수도 있습니다.

E.3 제약 조건 오버로딩

제약 조건들이 상호 배타적이지 않으며, 하나가 다른 것을 포섭하는 개념도 있습니다. 이는 iterator에서 입력, 순방향과 같이 계층적 구조를 이룰 때 볼 수 있는데, 만약 좀 더 특수화된 쪽, 즉 범위가 더 적은 쪽의 후보를 선호하게 됩니다. 이때 제약 조건이 많은 쪽이 적은 쪽을 포섭한다고 합니다.

E.4 개념 팁

  • 검사 개념으로 정적 단언문에 사용 가능합니다.
  • 이진 호환성을 알아 볼 수 있습니다.