2013-08-07 3 views
5

기본적으로 범위 형식을 Range<const char>에서 Range<const unsigned char>으로 암시 적으로 변환 할 수있게하려고합니다. std :: enable_if는 함수가 인수를 취하지 않고 반환하지 않기 때문에 불가능한 것처럼 보입니다. 무슨 일이야? 여기변환 연산자에서 std :: enable_if를 어떻게 사용할 수 있습니까?

내가 뭘하려 기본적으로 :

template<typename T> 
class Range{ 
    T* begin_; 
    T* end_; 
public: 
    Range(T* begin,T* end):begin_{begin},end_{end}{} 
    template<int N> 
    Range(T (&a)[N]):begin_{static_cast<T*>(&a[0])},end_{static_cast<T*>(&a[N-1])}{} 
    T* Begin(){return begin_;} 
    T* End(){return end_;} 
    operator typename std::enable_if<std::is_same<T,const char>::value,Range<const unsigned char>&>::Type(){ 
     return *reinterpret_cast<Range<const unsigned char>*>(this); 
    } 
}; 
+0

왜 'Loki :: IsSameType <>'대신'std :: is_same <>'을 사용하지 않으시겠습니까 ?? – Walter

+0

나는 ARM 피질에 베어 메탈을 프로그래밍하고 있는데, Loki를 작동시키기 위해서 처음에는 더 쉬웠다. 좋은 점과 내가 바꿨다;) – odinthenerd

+0

변환 연산자가 정말로 필요한가요? 또는'operator = '및 생성자로 살 수 있습니까? – Walter

답변

9

가 T 기본값은 더미 매개 변수가있는 템플릿 확인 -이 기능이 인스턴스화됩니다 지점 형태 추론을 연기하는 것입니다, 그렇지 않으면 SFINAE doesn't work. 그런 다음 다른 매개 변수의 기본값에서 원하는 검사를 수행합니다.

template< 
    typename U = T, 
    typename = typename std::enable_if< std::is_same<U,const char>::value >::type 
> 
operator Range<const unsigned char>() { 
    return *reinterpret_cast<Range<const unsigned char>*>(this); 
} 
+0

@joik 충돌하는 변환 연산자로 인한 오류를 지적 해 주셔서 감사합니다. – odinthenerd

+1

+1, C++가 필요함을 유의하십시오. 11 – Potatoswatter

+0

다소 특이한 "typename = typename ..."에 유의하십시오. 형식 이름을 사용하면 저에게 적합하지 않습니다. – Asher