模板和专业模板是如何的

How are templates, and specialised templates

本文关键字:      更新时间:2023-10-16

这是我不了解的代码

#include<iostream>
using namespace std;
template <typename T> 
T calc(T, T) { cout << "template calc" << endl; }
double calc(double, double) { cout << "ordinary calc" << endl; }
template <> 
char calc<char>(char, char) { cout << "template specialisation calc" << endl; }
int main() {
   int ival;
   double dval;
   float fd;
   calc(0, ival); // calls the generic calc(T, T)
   // the following all call calc(double, double)
   calc(0.25, dval);
   calc(0, fd);
   calc(0, 'J');
   calc('I', 'J'); // calls calc(char, char)
}

有5个函数调用,因此我将它们称为1) - 5)根据其位置。

1)有道理。0是一个整数,ival是一个整数,可以调用calc(t,t)是有道理的。尽管我觉得我的理由是错误的。毕竟,它们都是双打的,因此,如果调用了计算(双重,双),那也很有意义。因此在这里寻找澄清。

2)没有戏剧,两者都是双打,呼叫计算(双重,双重)。简单。

3)FD是浮点。可以调用calc(t,t)或calc(double,double)。因为1)导致对计算的呼叫(t,t),所以我假设在这里也会有同样的呼叫,因为我们再次有一个param是0,但是,这个调用calc(double,double)。因此,这使我感到困惑,尤其是1)

之间的区别

4)我的第一个想法是0是一个有效的字符," J"也是一个有效的字符,因此称为calc(char,char)。它可以使用常见的整数类型调用calc(t,t)。但是,不,这两个都错了,它调用calc(double,double)。我对此非常困惑。对我没有意义。

5)有意义,但是只有当我应用与4)相同的逻辑时,这在4)中是错误的,因此,如果我看到另一个使用模板的示例,我不确定什么逻辑申请。

因此,寻找解释为什么该程序执行它的作用。

谢谢。

首先,当您在源代码中编写字面的" 0"时,它是类型的" int"。并且在寻找可以致电的功能时,编译器选择最佳匹配的功能。如果不可用,编译器将进行一些隐式类型的转换以使其正常工作。

1)0和ival均为int

2)对于双重和双重,计算(双,双)匹配

3)对于int和float,找不到匹配,因此两者都转换为double

4)对于int和char,与3)

相同

5)对于char和char,calc(char,char)完全匹配

我建议您在超载分辨率上阅读:

选择最合适的超载函数或操作员的过程称为超载分辨率。

假设F是一个超载的函数名称。当您致电 超载函数f(),编译器创建一组候选人 功能。这组功能包括所有名为F的功能 可以从您称为f()的点可以访问。编译器 可能包括作为候选函数 那些名为F的可访问功能之一可以促进超负荷 分辨率。

创建一组候选功能后,编译器创建了一个 一组可行的功能。这组功能是 候选功能。每个可行函数的参数数量 同意您用来调用F()的参数数量。

编译器选择最佳可行函数,功能 声明C 运行时环境将使用时使用 F(),来自可行函数集。编译器通过 隐式转换序列。隐式转换序列是 转换函数中转换参数所需的序列 调用函数中相应参数的类型 宣言。隐式转换序列被排名;一些 隐式转换序列比其他序列更好。最好的可行 函数是其参数都更好或具有更好的参数的功能 等级的隐式转换序列比所有其他转换序列 可行的功能。编译器将不允许一个程序 编译器能够找到多个最佳的可行功能。

1、2和5都是完全匹配的,因此不需要转换。

要解释3和4,请注意,如果您删除double, double功能,则您的程序将不会编译。这是因为无法推导3和4的模板参数(因为参数类型与不匹配)。因此,只有double, double函数被视为候选功能。

相关文章:
  • 没有找到相关文章