2013-08-07 16 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