2013-08-07 37 views
5

Về cơ bản tôi muốn loại phạm vi của mình được chuyển đổi hoàn toàn từ Range<const char> thành Range<const unsigned char>. std :: enable_if dường như không thể vì hàm không có đối số và không trả về. Whats làm việc xung quanh?làm cách nào tôi có thể sử dụng lệnh std :: enable_if trong toán tử chuyển đổi?

Đây là cơ bản những gì tôi đã cố gắng:

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

tại sao không sử dụng 'std :: is_same <>' thay vì 'Loki :: IsSameType <>' ?? – Walter

+0

Tôi lập trình trần kim loại trên vỏ não và ban đầu nó dễ dàng hơn để có được Loki làm việc, vì vậy điểm tốt và tôi đã thay đổi nó;) – odinthenerd

+0

Bạn có thực sự cần một toán tử chuyển đổi không? Hoặc bạn có thể sống với 'operator =' và constructor? – Walter

Trả lời

9

Làm cho nó một khuôn mẫu với một tham số dummy mà mặc định là T - đây là hoãn loại trừ đến điểm mà các chức năng được instantiated, nếu không SFINAE doesn't work. Sau đó, bạn thực hiện kiểm tra bạn muốn trong giá trị mặc định của một tham số khác.

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 cảm ơn vì đã chỉ ra lỗi của tôi với các toán tử chuyển đổi xung đột, tôi đã xóa nó. – odinthenerd

+1

+1, lưu ý rằng điều này đòi hỏi C++ 11 – Potatoswatter

+0

Cũng lưu ý rằng hơi khác thường "typename = typename ...". Nó sẽ không làm việc cho tôi nếu tôi sử dụng một tên kiểu. – Asher

Các vấn đề liên quan