concepts는 템플릿 인자가 만족해야 하는 조건을 이름 있는 제약으로 만든다. C++20부터 표준이다. 실패하면 본문 깊은 곳에서 긴 오류가 나기보다, 제약에서 멈춘다.
제약 두 가지 문법
#include <concepts>
template <std::integral T>
T twice(T v) { return v + v; }
template <typename T>
requires std::totally_ordered<T>
const T& larger(const T& a, const T& b) {
return a < b ? b : a;
}`std::integral`, `std::same_as`, `std::convertible_to`, `std::ranges::range`처럼 표준 개념을 먼저 쓴다. 프로젝트 개념은 그것으로 부족할 때 `requires` 식으로 만든다. 본문에서 쓰는 연산이 제약에 없으면, 제약은 거짓말을 하는 것이다.
오버로드와 포함
제약이 더 촘촘한 오버로드가 느슨한 오버로드보다 우선할 수 있다. 이 관계를 포함이라고 부른다. 제약이 서로 포함되지 않으면 모호해진다. 개념을 잘게 쪼개 이름만 늘리기보다, 호출자가 구분해야 하는 차이만 개념으로 남긴다.
concepts는 가상 함수가 아니다. 실행 중 타입을 바꾸지 않고, 컴파일 때 후보를 고른다.
댓글
0개아직 댓글이 없습니다.