enable_if'dベースから継承
-
29-10-2019 - |
質問
私は非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)は正しい値です。
所属していません StackOverflow