This question already has an answer here:
Smplest way to provide template specialization for derived classes
                                
                                    (1个答案)
                                
                        
                                5年前关闭。
            
                    
如果T是从特定的基类派生的,我想专门研究模板类的实现。

我怎样才能做到这一点?

在下面的代码中,x.f()和y.f()应该做不同的工作。

我不仅要为“派生类”工作,而且还要为来自Base的所有派生类工作。

#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();
}

最佳答案

可以使用以下:

#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

09-30 17:12
查看更多