C에서는 SFINAE(대체 실패는 오류가 아님)를 사용하여 다음을 수행할 수 있습니다. 템플릿 인수 유형에 따라 코드를 활성화하거나 비활성화합니다. 그러나 클래스 템플릿의 멤버 함수를 처리할 때 SFINAE가 예상대로 작동하지 않는 경우가 많습니다.
다음은 문제를 보여주는 예입니다.
#include
struct A {};
struct B {};
template
struct Foo
{
typename std::enable_if<:is_same a>::value>::type bar()
{}
typename std::enable_if<:is_same b>::value>::type bar()
{}
};
이 예에서 Foo는 두 개의 오버로드된 멤버 함수 bar()를 정의합니다. 첫 번째 오버로드는 T가 A일 때 활성화되고 두 번째 오버로드는 T가 B일 때 활성화됩니다. 그러나 이 코드를 컴파일하려고 하면 오버로드를 해결할 수 없다는 오류 메시지가 표시됩니다.
이 오류가 발생하는 이유는 SFINAE가 추론된 템플릿 인수에만 작동하기 때문입니다. 클래스 템플릿의 멤버 함수의 경우 템플릿 인수가 추론되지 않고 명시적으로 지정됩니다. 문제를 해결하려면 다음 기술 중 하나를 사용할 수 있습니다.
명시적 템플릿 인수 사용:
struct Foo
{
void bar(A) {}
void bar(B) {}
};
멤버 함수 내에서 std::enable_if를 사용하세요:
template
struct Foo
{
template
typename std::enable_if<:is_same a>::value>::type bar() {}
template
typename std::enable_if<:is_same b>::value>::type bar() {}
};
명시적인 클래스 템플릿 전문화 사용:
template struct Foo { void bar() {} };
template struct Foo { void bar() {} };
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3