質問

私は非charの配列の特性を部分的に専門化しようとしています:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};

Visual Studio 2010はC2039を提供してくれます(type の要素ではありません enable_if...)。ただし、コンパイラエラーを発揮する代わりに、Sfinaeはここでボトムアウトしてはいけませんか?または、この場合、Sfinaeは適用されませんか?

もちろん、私は非charとcharの専門分野を分離することができました:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};

template<unsigned N>
struct is_container<char[N]> : std::false_type {};

しかし、私はこの特定のケースでSfinaeが機能しない理由を本当に知りたいです。

役に立ちましたか?

解決

テンプレートクラスの専門化を有効にするトピック「3.1」をチェックしてくださいhttp://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html

編集:boost.orgリンクが死んだ場合に備えて...

3.1テンプレートの有効クラスの専門化クラステンプレートの専門分野は、enable_ifで有効または無効にできます。イネーブラー式には、1つの追加のテンプレートパラメーターを追加する必要があります。このパラメーターには、デフォルト値が無効になります。例えば:

template <class T, class Enable = void> 
class A { ... };

template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };

template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };

積分タイプでインスタンス化すると、最初の専門化と一致しますが、浮動小数点タイプは2番目の専門分野と一致します。他のすべてのタイプは、プライマリテンプレートと一致します。この条件は、クラスのテンプレート引数に依存するコンパイル時間ブール式の任意のコンパイル時間ブール式にすることができます。繰り返しますが、enable_ifの2番目の引数は必要ありません。デフォルト(void)は正しい値です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top