반환 유형과 템플릿 매개변수의 SFINAE: A 비교
C에서 SFINAE(대체 실패는 오류가 아님) 관용구는 조건문을 허용합니다. 유형의 가용성을 기반으로 컴파일합니다. 그러나 템플릿 내의 다른 위치에 배치되면 동작이 달라질 수 있습니다.
템플릿 매개변수의 SFINAE
아래 코드에서 SFINAE는 템플릿 매개변수로 사용됩니다. 특정 템플릿 함수 오버로드를 활성화 또는 비활성화합니다.
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 { /* ... */ }
이 경우 SFINAE는 두 번째 템플릿 매개변수에 적용됩니다. 효과적으로 자리 표시자입니다. std::enable_if<:is_floating_point>::value>를 사용한 두 번째 템플릿 함수 선언이 foo(3.4)를 호출하려고 시도할 때 오류가 발생합니다. 정의되지 않아 오버로드가 누락되었습니다.
반환 유형의 SFINAE
반대로 다음 코드는 반환 유형에 SFINAE를 사용합니다.
template<typename T> auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type { /* ... */ } template<typename T> auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type { /* ... */ }
이 경우 반환 유형에 SFINAE가 적용되어 컴파일러가 제공된 인수를 기반으로 두 템플릿 함수를 구별할 수 있습니다. type.
차이가 있는 이유
동작의 차이는 기본 템플릿 인수 사용에서 비롯됩니다. 첫 번째 예에서 두 번째 템플릿 매개변수는 기본적으로 typename std::enable_if
그러나 두 번째 예에서는 반환 유형이 함수 시그니처의 일부인 표현식 내에서 SFINAE를 사용합니다. 이렇게 하면 템플릿 기능이 서로 다른 시그니처를 가지며 SFINAE가 예상대로 작동할 수 있습니다.
위 내용은 C의 SFINAE: 템플릿 매개변수와 반환 유형 – 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!