This question already has an answer here:
Smplest way to provide template specialization for derived classes
(1个答案)
5年前关闭。
如果T是从特定的基类派生的,我想专门研究模板类的实现。
我怎样才能做到这一点?
在下面的代码中,x.f()和y.f()应该做不同的工作。
我不仅要为“派生类”工作,而且还要为来自Base的所有派生类工作。
见Here
(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