2013-08-07 47 views
5

Temel olarak, aralık türünün Range<const char>'dan Range<const unsigned char>'a dönüştürülebilir olmasını istiyorum. std :: enable_if işlevi görünmez çünkü işlev hiçbir argüman almaz ve geri dönüşü yoktur. Ne iş var? İşteStd :: enable_if'i bir dönüşüm operatöründe nasıl kullanabilirim?

Denedim temelde ne:

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

neden 'std :: is_same <>' '' Loki :: IsSameType <> 'yerine kullanılmıyor? – Walter

+0

ARM kortekste çıplak metal programlama yapıyorum ve önce Loki'nin çalışmasını sağlamak daha kolaydı, bu yüzden iyi bir nokta ve ben değiştirdim;) – odinthenerd

+0

Gerçekten bir dönüşüm operatörüne ihtiyacınız var mı? Veya operatör = 've kurucu ile yaşayabilir misiniz? – Walter

cevap

9

o T varsayılan bir kukla parametresi olan bir şablon yap - Bu fonksiyon örneği alır noktaya tip kesinti ertelemek ise, aksi SFINAE doesn't work. Ardından istediğiniz başka bir parametrenin varsayılan değerini kontrol edin.

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 Çakışan dönüşüm operatörleri ile hatayı işaret ettiğin için teşekkürler. – odinthenerd

+1

+1, bunun C++ 11 – Potatoswatter

+0

gerektirdiğini unutmayın. Ayrıca biraz sıra dışı "typename = typename ..." not edin. Bir tür adı kullansaydım benim için işe yaramazdı. – Asher

İlgili konular