최근 질문에서 조건부 반환 유형으로 std::enable_if를 사용하는 방법이 논의되었습니다. 첫 번째 사용법은 분명했지만 std::enable_if에 대한 무의미해 보이는 할당을 포함하는 두 번째 사용법은 여전히 수수께끼였습니다.
개념 잠금 해제
수수께끼를 풀기 위해 , std::enable_if:
template<bool Cond, class T = void> struct enable_if {}; template<class T> struct enable_if<true, T> { typedef T type; };
핵심은 typedef T 유형이 bool Cond가 true인 경우에만 정의된다는 사실에 있습니다.
예제에 적용
이러한 이해를 바탕으로 코드를 다시 살펴보겠습니다.
template<typename T> typename std::enable_if<std::numeric_limits<T>::is_integer, void>::type foo(const T &bar) { isInt(bar); }
여기서 std::enable_if는 foo 함수의 반환 유형을 정의하는 데 사용됩니다. . T가 정수이면 반환 유형은 void가 됩니다. 그렇지 않으면 함수가 컴파일되지 않습니다.
기본 설정의 역할
두 번째 예에서:
template<typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0> void foo(const T& bar) { isInt(); }
기본 매개변수 = 0은 다음을 보장합니다. 두 옵션 모두 foo
이해의 발전
C 14에서는 std::enable_if_t 유형이 도입되었습니다. typedef 형식 대신 사용해야 합니다. 결과적으로 더 간결한 반환 유형이 생성됩니다.
std::enable_if_t<std::numeric_limits<T>::is_integer>
위 내용은 C 템플릿에서 std::enable_if에 겉보기에 무의미해 보이는 할당이 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!