2013-09-24 2 views
1

std :: enable_if의 두 번째 매개 변수에 대해 혼란스러워합니다. INT의 반환 형식으로 사용하여, 우리는 그것을 사용하여 만들 수 있습니다std :: enable_if의 두 번째 매개 변수는 무엇입니까?

template <class T> 
typename std::enable_if<mpi::is_builtin<T>::value, int>::type 
foo() { return 1; } 

을하지만 어떻게 내가 있었던 파라미터 또는 템플릿에 enable_if을 사용할 수 있습니까? 이 경우 아래 기능의 차이점은 무엇입니까?

template<class T , 
     class = typename std::enable_if<std::is_integral<T>::value>::type > 
T too(T t) { std::cout << "here" << std::endl; return t; } 

int too(int t) { std::cout << "there" << std::endl; return t; } 

감사합니다.

+0

플러그 : http://flamingdangerzone.com/cxx11/2012/06/01/almost-static-if.html –

답변

3

이 조건 std::is_integral<T>::value이 때문에 함수 타입 T 허용되는 true이므로 과부하 해상도에 참여하는 경우

template<class T , 
    class = typename std::enable_if<std::is_integral<T>::value>::type > 

경우가

template<class T , 
    class = void > 

이되는 것을 의미한다.

조건이 맞지 않으면 불법이되고 typename std::enable_if<...>::typeT 유형의 기능을 무효화합니다. 당신의 예에서 첫 번째 방법은 모든 정수형 (int, unsigned, long, ...)하지만 클래스 등

두 번째, 당신의 예에서 int를 전용 버전은 몇 가지 정보를 느슨한에서 값을 변환 할 수 있습니다 서명하지 않거나 일부 값을 좁히는 경우가 있습니다. 따라서 어떤 경우에는 첫 번째 버전이 실제로 도움이 될 수 있습니다.

std::enable_if의 두 번째 매개 변수에 대한 기본값은 실제로 void입니다. 실제로는 특정 유형이 필요하지 않으므로 템플릿 등을 설정하거나 해제하는 데 충분합니다. 알아야 할/알 수있는 것은 유효한지 (void) 또는 유효하지 않은 것인데,이 경우 ::type 부분에 유효한 대체자가 없습니다. 아래 너무 기능의 차이가 무엇

+0

관련된 후속 질문은 언제 효력이 충분하지 않습니까? – Rickard

+1

@Rickard 고전적인 예는 함수의 ** 반환 유형 **에 대한 SFINAE입니다. 'E'가 enum 일 때 오버로드 집합의 일부일 뿐이고'int'를 반환하는 함수 템플릿에 대해서 std :: enable_if_t , int> f (E e);'템플릿 . –

0

:

하나는 어떤 CopyConstructible (복사 가능 생성자) 유형이라고 할 수있는 템플릿이다가의 enable_if는 기본 템플릿 인수를 사용하는 경우를 제약 :

#include <iostream> 

template<class T , 
     class = typename std::enable_if<std::is_integral<T>::value>::type > 
T too(T t) { std::cout << "here" << std::endl; return t; } 

int too(int t) { std::cout << "there" << std::endl; return t; } 

int main() 
{ 
    too<double, void>(1.0); 
}