c++ - 具有多种可行类型的模板重载解析

标签 c++ templates

这是用于计算最大值的 2 个模板函数

template<typename T>
auto max(T a, T b) {
  cout <<  "Calling 1\n";
  return b < a ? a : b;
}

template<typename T1, typename T2>
auto max (T1 a, T2 b) {
  cout <<  "Calling 2\n";
  return b < a ? a : b;
}

如果我调用 max 函数如下

max(1, 2);

选择了第一个功能(调用 1)。为什么会这样?在这种情况下,1 和 2 都可以很好地匹配。

最佳答案

这是因为第一个 max作为第二个更专业max .

在模板重载解析期间发生的事情是编译器实例化两个模板,然后询问“哪个更专业?”

简而言之,它问,给定重载 A 和重载 B,“我可以使用从 A 推导出的类型实例化 B,反之亦然吗?”如果是这样,那么 A 比 B 更专业(我们可以从 A 到 B,但不能返回)。它以另一种方式做同样的事情。如果两者都可以相互实例化,则是模棱两可的,并且是编译器错误。

实际上,我们不使用 T 的实际类型。 (在这种情况下为 int),但有些是虚构的( "synthesized type" )。

在您的情况下,第一个模板要求两种类型相同:

template<typename T>
auto max(T a, T b)

所以我们有 max<int> (或 max<synthesized1>)

我们可以实例化第二个给定的 synthesized1T ?没问题,T1 = synthesized1T2 = synthesized1 .

我们可以走另一条路吗?

第二个模板有两个参数,所以它允许 ab是不同的类型,所以它更通用。它使用两种合成类型进行实例化:
template<typename T1, typename T2>
auto max (T1 a, T2 b)

所以,max<synthesized2, synthesized3> .

我们可以实例化第一个 max<T>带类型 synthesized2synthesized3 ?不,它需要 ab具有相同的类型。因此第一个模板更专业,编译器选择它。

引用 [temp.deduct.partial]标准语

关于c++ - 具有多种可行类型的模板重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61332526/

相关文章:

c++ - 将传感器数据发布给制图师

c++ - 内存高效的 std::map 替代方案

c++ - 在 Visual Studios 2010 的外部依赖文件夹中搜索文本/代码

c++ 模板队列类的嵌套初始化

java - 在 Intellij 中为 Java 创建实时模板

C++0x:std::function::target 和模板参数出错

c++ - 接受无限相同数量的 3 种类型的函数

c++ - 引用/值混淆有问题吗?

c++ - 有没有办法指定和使用属于 C++ 类的所有数据成员的列表

java - 如何在 Play Framework 中预先选择单选按钮/复选框组?