C에서는 SFINAE(대체 실패는 오류가 아님)를 사용하여 다음을 수행할 수 있습니다. 유형 특성에 따라 템플릿 전문화를 조건부로 활성화하거나 비활성화합니다. 그러나 템플릿 반환 유형과 템플릿 매개변수에서 SFINAE를 다르게 적용하면 일반적인 문제가 발생합니다.
다음 주요 기능을 고려하세요.
int main() { foo(5); foo(3.4); }
SFINAE를 템플릿 매개변수에 배치하면 아래와 같이 컴파일에 실패합니다. 오류:
template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type> auto foo(T) -> void { std::cout << "I'm an integrer!\n"; } template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type> auto foo(T) -> void { std::cout << "I'm a floating point number!\n"; }
그러나 이 구현은 올바르게 작동합니다.
template<typename T> auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type { std::cout << "I'm an integrer!\n"; } template<typename T> auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type { std::cout << "I'm a floating point number!\n"; }
차이점 함수 템플릿 오버로드가 C 표준(14.5.6.1)에 정의된 방식에 있습니다. 오버로드된 템플릿은 동일한 함수 이름, 동일한 수의 매개변수 및 동일한 매개변수 유형을 갖는 경우 동일합니다. 그러나 이 비교에서는 기본 템플릿 인수가 고려되지 않습니다.
잘못된 구현에서는 SFINAE 조건이 기본 템플릿 인수로 포함되어 두 개의 동일한 함수 템플릿이 두 번 정의됩니다. 이로 인해 컴파일 오류가 발생합니다.
올바른 구현에서는 SFINAE 조건이 템플릿 반환 유형의 일부로 사용됩니다. 여기에는 템플릿 매개변수를 참조하는 표현식이 포함되므로 두 함수의 시그니처가 다르므로 SFINAE가 의도한 대로 작동할 수 있습니다.
위 내용은 C의 SFINAE: 조건부 템플릿 전문화를 위한 반환 유형과 매개변수 유형?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!