私はテンプレートクラス(A)を持っています。クラスTが抽象クラスIClassから派生しているかどうかをどのように確認できますか?テンプレートの引数を確認する
template <class T>
class A
{
//T have to be derived from abstract class IClass
} ;
感謝テンプレートコンセプトチェックと呼ばれて何をしようとしている
私はテンプレートクラス(A)を持っています。クラスTが抽象クラスIClassから派生しているかどうかをどのように確認できますか?テンプレートの引数を確認する
template <class T>
class A
{
//T have to be derived from abstract class IClass
} ;
感謝テンプレートコンセプトチェックと呼ばれて何をしようとしている
。これらはC++ 11の機能となる予定でしたが、標準化委員会はこれを削減しました。
あなたはまだそれを行うことができますが、そうでなければそうでないほどきれいではありません。ビャーネ・ストロヴストルップは、彼のよくある質問でこれを行う方法について説明しますhttp://www2.research.att.com/~bs/bs_faq2.html#constraints
具体的に、彼はこの例を示します:
template<class T, class B> struct Derived_from {
static void constraints(T* p) { B* pb = p; }
Derived_from() { void(*p)(T*) = constraints; }
};
それはコンパイラエラーをつまずかますように、そして、あなたは自分のクラスの中で、ダミーの親を宣言します。
template <class T> class A : Derived_from<T,IClass> { ... }
Stroustrupは、これが継承ではなく変換を実際にテストすると述べています。それが必要な場合は、継承のみをテストする方法があります。静的を使用して
はアサートし、ブースト、TR1またはC++ 11からis_base_of
:
template <class T>
class A {
public:
BOOST_STATIC_ASSERT((boost::is_base_of<IClass, T>::value));
};
が、私はそこに知っていたそれをやってより多くのパッケージアップの方法でなければなりませんでした。これを使って。 –