>백엔드 개발 >C++ >C의 SFINAE: 조건부 템플릿 전문화를 위한 반환 유형과 매개변수 유형?

C의 SFINAE: 조건부 템플릿 전문화를 위한 반환 유형과 매개변수 유형?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-13 02:33:13693검색

SFINAE in C  : Return Type vs. Parameter Type for Conditional Template Specialization?

템플릿 반환 유형과 매개변수의 SFINAE

문제 설명

C에서는 SFINAE(대체 실패는 오류가 아님)를 사용하여 다음을 수행할 수 있습니다. 유형 특성에 따라 템플릿 전문화를 조건부로 활성화하거나 비활성화합니다. 그러나 템플릿 반환 유형과 템플릿 매개변수에서 SFINAE를 다르게 적용하면 일반적인 문제가 발생합니다.

다음 주요 기능을 고려하세요.

int main()
{
    foo(5);
    foo(3.4);
}

템플릿 매개변수에서 SFINAE를 사용한 잘못된 구현

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";
}

반환 유형에서 SFINAE를 사용한 올바른 구현

그러나 이 구현은 올바르게 작동합니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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