"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > SFINAE가 클래스 템플릿의 멤버 함수와 작동하지 않는 이유는 무엇입니까?

SFINAE가 클래스 템플릿의 멤버 함수와 작동하지 않는 이유는 무엇입니까?

2024년 11월 10일에 게시됨
검색:116

Why Doesn't SFINAE Work with Member Functions of Class Templates?

SFINAE(enable_if)가 클래스 템플릿의 멤버 함수에 대해 작동하지 않는 이유는 무엇입니까?

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