11

type に応じてテンプレート化されたクラスがあるとしましょうT。 、、または; T_ 、参照、または cv 修飾されたものであってはなりません。いくつかの最適化のために、サブクラス化できるかどうかを知る必要があります。したがって、基本的な特性の論理的な組み合わせとして、またはいくつかの SFINAE トリックによって決定される特性タイプが必要です。intint*pair <int, int>struct lolvoidTis_subclassable

元の例では、intとはサブクラス化できませんが、とint*はサブクラス化できません。pair <int, int>struct lol

EDIT : litb が以下で指摘したように、共用体もサブクラス化Tできず、共用体型にすることもできます。

必要な特性タイプをどのように記述すればよいですか?

4

1 に答える 1

13

それが非ユニオンクラスであるかどうかを判別する必要があります。それを行う方法は私には知られていません(そしてブーストも方法を見つけていません)。ユニオンケースの誤検知に対応できる場合は、を使用できますis_class

template<typename> struct void_ { typedef void type; };

template<typename T, typename = void>
struct is_class { static bool const value = false; };

template<typename T>
struct is_class<T, typename void_<int T::*>::type> { 
  static bool const value = true; 
};

Boostには、is_unionコンパイラ固有のビルトインを使用するがあります。これは、ここで役立ちます。is_class(ブーストも提供します)と組み合わせるとis_union、問題が解決します。

于 2011-06-30T20:53:47.973 に答える