2013-08-07 8 views
5

Zasadniczo chcę, aby mój typ zakresu był niejawnie wymienialny z Range<const char> na Range<const unsigned char>. std :: enable_if wydaje się niemożliwe, ponieważ funkcja nie przyjmuje argumentów i nie ma zwrotu. Co to za praca?Jak mogę użyć std :: enable_if w operatorze konwersji?

Oto zasadzie co starałem:

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

dlaczego nie używać 'std :: is_same <>' zamiast 'Loki :: IsSameType <>' ?? – Walter

+0

Programuję bare metal w kamerze ARM i początkowo łatwiej było działać Loki, więc dobrze trafiłem i zmieniłem to;) – odinthenerd

+0

Czy naprawdę potrzebujesz operatora konwersji? Czy mógłbyś mieszkać z 'operator =' i konstruktorem? – Walter

Odpowiedz

9

Zrób to szablon z manekina parametru, który domyślnie T - to odłożyć typu odliczenia do momentu, gdy funkcja zostanie instancja, inaczej SFINAE doesn't work. Następnie wykonaj test, który chcesz w wartości domyślnej innego parametru.

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 dziękuję za wskazanie mojego błędu z powodujących konflikt operatorów konwersji, usunąłem go. – odinthenerd

+1

+1, zauważ, że wymaga to C++ 11 – Potatoswatter

+0

Zwróć także uwagę na nieco nietypowy "typename = nazwa_typu ...". Nie byłoby to dla mnie przydatne, gdybym użył nazwy typu. – Asher

Powiązane problemy