C++ 函数模板和派生类
如果这是代码,为什么C++ 函数模板和派生类,c++,templates,derived-class,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
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;
}
模板无效foo(T val)
{
printf(“称为\n的模板”);
}
阶级基础
{
};
无效foo(常数基准和val)
{
printf(“称为\n的基”);
}
派生类:公共基
{
};
int main(){
导出d;
傅(丁),;
返回0;
}
为什么foo(d)
调用模板函数而不是“base”函数
因为对于模板函数,foo
T
被推断为派生的
,所以它是精确匹配的。对于非模板,需要进行从派生到基本的转换
你可以用它;使函数模板仅适用于不是从Base
(或Base
本身)派生的类型
模板
std::启用\u if\u t>foo(t val)
{
printf(“称为\n的模板”);
}
foo
是一个精确匹配。您可能认为模板函数是您不希望重载的。您的非模板化foo()
不是完全匹配的-它需要从常量派生(
转换为常量基(
)。模板化的foo()
提供了精确匹配(foo()
)。精确匹配(无类型转换)比需要类型转换的匹配更可取。谢谢。对于我的需求,这将导致严重的痛苦,因为我希望使用模板函数作为后备。SFINAE意味着模板必须明确知道哪些对象不能使用它,哪些类型的依赖关系颠倒了。我认为常规函数重载对我来说可能是更好的方法。@Roddy重载方法意味着您必须添加另一个重载,该重载以派生的
为参数;否则,正如您所看到的,函数模板将在重载解析中获胜。是的,理解。但我现在计划完全抛弃模板函数,并为以前由模板处理的情况提供显式重载函数。
template <class T>
std::enable_if_t<!std::is_base_of_v<Base, T>> foo(T val)
{
printf("template called\n");
}