2014-10-02 68 views
0

如果T是從特定基類派生的,我想專門實現模板類。如果T是從特定基類派生的,那麼如何專門化模板類的實現

我該怎麼做?

在下面的代碼中,x.f()和y.f()應該做不同的工作。

我想不僅爲「派生」而且爲所有來自基類的派生類工作。

#include <iostream> 

class Base 
{ 
}; 

class Derived : public Base 
{ 
}; 

// If T not derived from Base: 
template <typename T> class MyClass 
{ 
public: 
    void f() 
    { 
     std::cout << "NOT derived from Base"; 
    } 
}; 

// If T derived from Base: 
template <typename T> class MyClass 
{ 
public: 
    void f() 
    { 
     std::cout << "Derived from Base"; 
    } 
}; 

int main() 
{ 
    MyClass<int> x; 
    MyClass<Derived> y; 
    x.f(); 
    y.f(); 
} 
+1

以下可能會有所幫助:https://ideone.com/tlxtbs – Jarod42 2014-10-02 13:15:05

+0

更多的往往不是你** **真的想根據參數類的特徵專門化模板,而不是基於參數的繼承。在這種情況下...使用特質輔助類。 – ArunasR 2014-10-02 13:28:48

回答

1

可以使用下列內容:

#include <type_traits> 

//If T not derived from Base: 
template<class T, class Enable = void> class MyClass 
{ 
public: 
    void f() 
    { 
     std::cout << "NOT derived from Base"; 
    } 
}; 


template<typename T> 
class MyClass<T,typename std::enable_if<std::is_base_of<Base, T>::value>::type> 
{ 
public: 
    void f() 
    { 
     std::cout << "\nDerived from Base"; 
    } 
}; 

Here

+0

我想爲所有派生類工作,不僅「派生」。 – 2014-10-02 12:59:14

+0

@ A.Danesh更新 – P0W 2014-10-02 13:20:17

+0

我認爲http://stackoverflow.com/a/25934222/1132686更簡單。 – 2014-10-02 13:34:33

相關問題