gpt4 book ai didi

c++ - 模板类型背后的含义是什么?

转载 作者:行者123 更新时间:2023-11-30 02:26:04 24 4
gpt4 key购买 nike

通过使用模板:

template <class T>
T GetMax (T a, T b) {
return (a>b?a:b);
}

然后

int main () {
int i=5, j=6, k;
long l=10, m=5, n;
k=GetMax(i,j); // line 1
n=GetMax<int>(l,m); // line 2
n=GetMax<double>(l,m); // line 3
cout << k << endl;
cout << n << endl;
return 0;
}

我的问题是:

为什么我需要这样做:

n=GetMax<int>(l,m);      // line2

如果我能做到

n=GetMax(l,m);      // line 2

为什么编译成功?

n=GetMax<double>(l,m);     

lm 是与 double 相差很远的整数时?

最佳答案

在这种情况下,您可以认为模板实例化是一种简单的文本替换(离它不远),一旦您弄清楚了模板参数。所以:

  1. 让编译器从操作数中找出类型。由于它们匹配,T 被计算为 int。您可以在标准中找到排名匹配模板参数的确切逻辑。你的情况很简单。

找出模板参数后,进行替换,因此您的函数如下所示:

int GetMax (int a, int b) {
return (a>b?a:b);
}

当您使用多个参数并且有许多可能与继承等匹配时,它确实会变得复杂

对于您的情况,您可以通过使用两种不同类型的参数来引发相等匹配,即:GetMax(i,l)T 有两个候选者:double as int,两者都同样好。

这与著名的SFINAE(替换失败不是错误)有关。编译器尝试为可能的参数组合生成版本,如果失败,则不会考虑最终排名。在您的情况下,两次替换都成功了。

  1. 您明确声明 T 是 int。所以编译器不会调用自动参数匹配。实例化版本看起来与 1 相同。

  2. 您在 double 中明确声明了 T。同样,编译器不会调用有关类型的任何逻辑。

它盲目地为double生成版本,并使用它:

 double GetMax (double a, double b) {
return (a>b?a:b);
}

int 传递给使用 double 的函数是合法的,会发生隐式转换。

这是完全合法的:

void f(double d) {};

int main(){
int i = 5;
f(i);
}

底线:

找出模板类型与调用函数是不同的逻辑。将其视为单独的阶段。类型推导旨在使调用有意义,但它是另一回事。

关于c++ - 模板类型背后的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43342634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com