2013-08-07 16 views
5

Fondamentalmente voglio che il mio tipo di intervallo sia implicitamente convertibile da Range<const char> a Range<const unsigned char>. std :: enable_if sembra impossibile perché la funzione non accetta argomenti e non ha alcun ritorno. Qual è il lavoro intorno?come posso usare std :: enable_if in un operatore di conversione?

Qui è fondamentalmente ciò che ho provato:

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

perché non utilizzare 'std :: is_same <>' invece di 'Loki :: IsSameType <>' ?? – Walter

+0

Sto programmando bare metal su una corteccia ARM ed è stato più facile in un primo momento far funzionare Loki, quindi è stato un buon punto e l'ho cambiato;) – odinthenerd

+0

Hai davvero bisogno di un operatore di conversione? O potresti vivere con 'operator =' e costruttore? – Walter

risposta

9

Ne fanno un modello con un parametro fittizio che il default è T - questo è di rinviare tipo di detrazione al punto in cui viene istanziato la funzione, altrimenti SFINAE doesn't work. Quindi esegui il controllo desiderato nel valore predefinito di un altro parametro.

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 grazie per aver segnalato il mio errore con operatori di conversione in conflitto, l'ho rimosso. – odinthenerd

+1

+1, si noti che ciò richiede C++ 11 – Potatoswatter

+0

Inoltre, si noti l'inusuale "typename = typename ...". Non funzionerebbe per me se usassi un nome tipo. – Asher

Problemi correlati