>백엔드 개발 >C++ >SFINAE가 반환 유형과 템플릿 매개변수에 적용될 때 어떻게 다릅니까?

SFINAE가 반환 유형과 템플릿 매개변수에 적용될 때 어떻게 다릅니까?

DDD
DDD원래의
2024-12-19 12:44:11839검색

How Does SFINAE Differ When Applied to Return Types Versus Template Parameters?

반환 유형과 템플릿 매개변수의 SFINAE 적용 가능성

C 프로그래밍에서 SFINAE(Substitution Failure Is Not An Error)는 템플릿 메타프로그래밍. SFINAE를 사용하면 템플릿 매개변수를 사용하여 템플릿 함수 또는 클래스에 전달될 수 있는 인수 유형에 대한 제약 조건을 지정할 수 있습니다.

귀하의 예에는 foo라는 함수에 대한 두 가지 구현이 있습니다.

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void;

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void;

첫 번째 구현에서는 템플릿 매개변수에 std::enable_if 메타함수와 함께 SFINAE를 사용합니다. 이는 템플릿 함수 foo가 std::is_integral::value 조건을 충족하는 유형으로만 호출될 수 있음을 의미합니다.

그러나 두 번째 구현에서는 반환 시 std::enable_if와 함께 SFINAE를 사용합니다. 템플릿 함수의 유형입니다. 이 경우 foo 함수는 어떤 유형으로든 호출할 수 있지만 T가 std::is_integral::value 조건을 충족하는 경우에만 반환 유형은 void 유형이 됩니다.

귀하의 예에서는 템플릿이 첫 번째 템플릿 매개변수에 대해 이미 인스턴스화되었는지 확인할 때 두 번째 템플릿 매개변수에 대한 기본 템플릿 인수가 고려되지 않기 때문에 첫 번째 구현이 컴파일에 실패합니다. 따라서 컴파일러는 동일한 함수 템플릿을 두 번 다시 선언하려고 시도하여 오류가 발생한다고 가정합니다.

반면에 두 번째 구현은 typename std::enable_if::value>::type은 템플릿 인스턴스화 중에 평가되고 함수의 반환 유형으로 사용됩니다. 이 표현식은 템플릿 함수 시그니처의 일부이므로 SFINAE가 T 값을 기반으로 다양한 템플릿 전문화를 구별할 수 있습니다.

위 내용은 SFINAE가 반환 유형과 템플릿 매개변수에 적용될 때 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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