函数模板和派生类

时间:2018-05-06 13:44:26

标签: c++ templates derived-class

如果是这段代码,为什么foo(d)会调用模板函数而不是' base'功能?有没有办法让它调用基函数而不显式写另一个函数重载?

template <class T> void foo(T val)
{
    printf("template called\n");
}

class Base
{
};

void foo(const Base &val)
{
  printf("Base called\n");
}

class Derived : public Base
{   
};

int main() {
    Derived d;
    foo(d);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

  

为什么foo(d)调用模板函数而不是'base'函数?

因为模板函数foo T被推导为Derived,所以它是完全匹配的。对于非模板,需要进行派生到基础的转换。

您可以使用SFINAE执行此操作;使函数模板仅适用于不是从Base(或Base本身)派生的类型。

template <class T> 
std::enable_if_t<!std::is_base_of_v<Base, T>> foo(T val)
{
    printf("template called\n");
}

LIVE