2016-12-07 7 views
0

고려중인 가능한 방법을 제거하기 위해 enable_if 문을 사용하고 있습니다.코드 제거에 enable_if가 사용되는 방법

#include "gmpxx.h" 
#include <iostream> 

template <typename T> 
struct is_ring_field { 
}; 

template <> 
struct is_ring_field<int> { 
    static const bool value = false; 
}; 

template <> 
struct is_ring_field<mpq_class> { 
    static const bool value = true; 
}; 

template<typename T> 
std::enable_if<is_ring_field<T>::value,int> RankMat(T const& Input) 
{ 
    return 10; 
} 

template<typename T> 
std::enable_if<(not is_ring_field<T>::value),int> RankMat(T const& Input) 
{ 
    return 20; 
} 

int main() 
{ 
    int M1=10; 
    mpq_class M2=3; 
    std::cerr << "FICT rank(M1)=" << RankMat(M1) << "\n"; 
    std::cerr << "FICT rank(M2)=" << RankMat(M2) << "\n"; 
} 

최종 목표는 입력시 대수 데이터 유형에 따라 달라지는 메소드를 갖는 것입니다. 다른 특성을 위해 그것은 나를 위해 일했지만이 것은 아닙니다. 이 경우 컴파일러에서 이상하게 호출이 모호하다고 말합니다. 즉 std :: enable_if이 실패했습니다.

+1

RankMat에 대한 두 가지 오버로드를 살펴보십시오. 과부하의 어떤 부분이 다른가요? 그 부분이 유효한 과부하와 다른 함수의 유일한 부분 일 수 있습니까? – NathanOliver

+2

'typename std :: enable_if <*,*> :: type'을 잊지 않으셨습니까? –

+0

예, 메시지를 작성한 후 알았습니다. 죄송합니다. clang ++ 및 g ++의 메시지는 도움이되지 않았습니다. –

답변

-1

방금 ​​위치를 잘못 지정했습니다. 이 시도 :

template<typename T> 
int RankMat(T const& Input, typename std::enable_if<is_ring_field<T>::value,T>::type* = 0) 
{ 
     return 10; 
} 

template<typename T> 
int RankMat(T const& Input, typename std::enable_if<(not is_ring_field<T>::value),T>::type* = 0) 
{ 
     return 20; 
} 

나이 :

template<typename T, typename TT = is_ring_field<T>> 
int RankMat(T const& Input) 
{ 
     return TT::value ? 10 : 20; 
} 
+0

실제로 이것은 sfinae에서 소프트 오류를 ​​생성 할 수있는 유일한 컨텍스트가 아닙니다 ... [this] (http://melpon.org/wandbox/permlink/7MK1lLnULUVp04JY) 및 [this] (http://melpon.org/ 완드 박스/permlink/SlFEgbxo6ZzxDATO). 함수 템플리트 매개 변수가 기본값이 될 수 없기 전에 C++ 11 이후에 실제로 제안 된 것은 ... –

+0

오른쪽. 빠른 답변은 좋지 않습니다. 나는 잘못된 정보를 주었다. 이것은 나를위한 교훈이다. –

+0

답변을 향상시킬 수있는 교훈을주기 위해 의견을 말하지 않았습니다 ... –

2

std::enable_if<> 유효한 유형이다;

template<typename T> 
typename std::enable_if<is_ring_field<T>::value,int>::type RankMat(T const& Input) 
{ 
    return 10; 
} 

template<typename T> 
typename std::enable_if<(not is_ring_field<T>::value),int>::type RankMat(T const& Input) 
{ 
    return 20; 
}