c ++检查模板参数是否来自某个基类

时间:2015-08-07 15:26:19

标签: c++ templates inheritance

如何检查我的模板参数是否来自某个基类?所以我确信可以调用函数Do:

template<typename Ty1> class MyClass
{
  ...
  void MyFunction();
}; 

template<typename Ty1> void MyClass<Ty1>::MyFunction()
{
  Ty1 var;
  var.Do();
}

2 个答案:

答案 0 :(得分:7)

唐&#39;吨。如果方法Do()在作为Ty1的参数提供的类中不存在,则它将无法编译。

模板是duck typing的一种形式:类的能力不是由它继承的接口决定的,而是由它实际暴露的功能决定的。

优势在于,任何类可以使用合适的Do()方法使用您的模板,无论其来自何处或具有何种基础。

答案 1 :(得分:6)

您可以使用标准类型特征is_base_of来实现此目的。看一下这个例子:

#include <iostream>
#include <type_traits>

using namespace std;

class Base {
public:
        void foo () {}
};

class A : public Base {};
class B : public Base {};
class C {};


void exec (false_type) {
        cout << "your type is not derived from Base" << endl;
}

void exec (true_type) {
        cout << "your type is derived from Base" << endl;
}

template <typename T>
void verify () {
        exec (typename is_base_of<Base, T>::type {});
}

int main (int argc, char** argv) {
        verify<A> ();
        verify<B> ();
        verify<C> ();

        return 0;
}

输出是:

your type is derived from Base
your type is derived from Base
your type is not derived from Base