函数模板和派生 类

Function templates and derived classes

如果这段代码,为什么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;
}

why does foo(d) call the template function rather than the 'base' function?

因为模板函数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