2012-01-09 216 views
0

我有一個模板類(A)。我如何檢查T類是否從抽象類IClass派生?檢查模板參數

template <class T> 
class A 
{ 
     //T have to be derived from abstract class IClass 
} ; 

感謝

回答

1

你想要做的是爲模板的概念檢查引用。這些將成爲C++ 11的一個功能,但標準委員會將其裁掉。

儘管如此,它仍然可以做到,但它並不像其他方式那樣乾淨。 Bjarne的Stroustrup的解釋如何做到這一點在他的FAQ: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提到,這實際上是測試轉換,而不是繼承。如果這是你需要的,可能只有專門測試繼承的方法。

4

使用靜態斷言和升壓,TR1或C++ 11 is_base_of

template <class T> 
class A { 
public: 
    BOOST_STATIC_ASSERT((boost::is_base_of<IClass, T>::value)); 
}; 
+0

我知道必須有這樣做的更打包式的方式。用這個。 – 2012-01-09 21:50:26