2017-03-27 14 views
0

위한 클래스 멤버 funrtion을 해제,하지만 상황은 실제로 매우 간단합니다 std::enable_if어떻게 간단한 것 같다 특정 템플릿 유형

의 구문 어려움을합니다.

템플릿 파라미터 T의 한 특정 유형에 대해 구현되지 않는다 T

2 기능 템플릿 클래스. T

한 함수가 int를 받아 다른 함수가 int를 반환의

두 함수는 매개 변수 또는 반환 값이 없습니다.

간단한 예가 무엇입니까?

std::enable_if을 사용하지 않는 다른 옵션 (C++ 11)이 있습니까?

답변

1

정말 간단합니다. 클래스/구조체 템플릿 매개 변수에 기본값으로 설정된 다른 템플릿 매개 변수를 사용해야합니다.

는 두 멤버, void foo<T>::bar1 (int)int foo<T>::bar2()와 클래스 foo<T>을한다고 가정하고 bar1()bar2()Tlong 다른 경우에만 구현되어 있음을한다고 가정.

위험이 있습니다

#include <type_traits> 

template <typename T> 
struct foo 
{ 
    template <typename U = T> 
    typename std::enable_if<false == std::is_same<U, long>::value>::type 
     bar1 (int) 
     { } 

    template <typename U = T> 
    typename std::enable_if<false == std::is_same<U, long>::value, int>::type 
     bar2() 
     { return 0; } 
}; 

int main() 
{ 
    foo<int> fi; 
    foo<long> fl; 

    fi.bar1(0); // compile 
    fi.bar2(); // compile 

    // fl.bar1(0); // compilation error 
    // fl.bar2(); // compilation error 
} 

다음과 같이 할 수있다 :이 문제를 방지하려면

foo<long> fl; 

fl.bar1<long long>(0); 

을 다음과 같이 누군가가 당신의 통제와 노골적인 U 유형을 우회 할 수있다, 당신은 당신의 std::enable_if을 향상시킬 수 있습니다 다음과 같이 테스트하십시오.

template <typename U = T> 
    typename std::enable_if 
     <sizeof(U) && (false == std::is_same<T, long>::value)>::type 
     bar1 (int) 
     { } 

    template <typename U = T> 
    typename std::enable_if 
     <sizeof(U) && (false == std::is_same<T, long>::value), int>::type 
     bar2() 
     { return 0; } 

당신이 typename의 커플 ::type 경우 몇 피할 수 std::enable_if_t를 사용하여 C++ 14 컴파일러를 사용하고 내가 원하는 whant는 완벽했다

template <typename U = T> 
    std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value)> 
     bar1 (int) 
     { } 

    template <typename U = T> 
    std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value), int> 
     bar2() 
     { return 0; } 
+1

감사를 다음과 같이 코드를 semplify. 그러나 나는 아직도 약간의 이해가 부족하다. 'U'대신 'T'를 직접 사용할 수없는 이유는 무엇입니까? ? 또한 두 번째 예제 인 sizeof (U)는 어떻게 0이 될 수 있습니까? – Waldorf