>백엔드 개발 >C++ >C 템플릿에서 std::enable_if에 겉보기에 무의미해 보이는 할당이 있는 이유는 무엇입니까?

C 템플릿에서 std::enable_if에 겉보기에 무의미해 보이는 할당이 있는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-06 10:49:02704검색

Why is there a Seemingly Meaningless Assignment to std::enable_if in C   Templates?

std::enable_if의 내부 작동 이해

최근 질문에서 조건부 반환 유형으로 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(1);로 호출할 수 있습니다. 기본값을 설정하지 않으면 foo를 호출하려면 int 대신 두 개의 템플릿 매개변수가 필요합니다.

이해의 발전

C 14에서는 std::enable_if_t 유형이 도입되었습니다. typedef 형식 대신 사용해야 합니다. 결과적으로 더 간결한 반환 유형이 생성됩니다.

std::enable_if_t<std::numeric_limits<T>::is_integer>

위 내용은 C 템플릿에서 std::enable_if에 겉보기에 무의미해 보이는 할당이 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.