6

非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は適用されませんか?

もちろん、非文字と文字の特殊化を分離することもできます。

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が機能しない理由を本当に知りたいと思います。

4

1 に答える 1

2

http://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.htmlのトピック「3.1テンプレートクラスの特殊化の有効化」を確認して ください。

編集:boost.orgリンクが死んだ場合...

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

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> { ... };

任意の整数型でAをインスタンス化すると、最初の特殊化に一致しますが、浮動小数点型は2番目の特殊化に一致します。他のすべてのタイプは、プライマリテンプレートと一致します。条件は、クラスのテンプレート引数に依存するコンパイル時のブール式にすることができます。ここでも、enable_ifの2番目の引数は必要ないことに注意してください。デフォルト(void)は正しい値です。

于 2011-09-12T15:11:06.370 に答える