我正在尝试理解下面的示例代码。 我知道我们可以显式指定数据类型但不确定“int,double”和“int,int”的含义。 为什么我们编写函数模板而不是T tripleit(T Val){T temp = val * 3; }? 提前谢谢。
#include <iostream>
using namespace std;
// why do we write this way instead of T tripleit (T Val) { T temp = val * 3; }?
template <class T, class U>
T tripleit (U val)
{
T temp = val * 3;
}
int main()
{
int a=5;
double d=3.3;
cout << "Explicit int; int argument: " << tripleit<int>(a) << endl;
cout << "Explicit int; double argument: " << tripleit<int>(d) << endl;
// what does <int, double> and <int, int> mean?
cout << "Explicit int, double; double argument: " << tripleit<int, double>(d) << endl;
cout << "Explicit int, int; double argument: " << tripleit<int, int>(d) << endl;
return 0;
}
顺便说一下,输出是:
显式int; int参数:15
显式int;双重论证:9
显式int,double;双重论证:9
Explicit int,int;双重论证:9
答案 0 :(得分:2)
如果模板参数具有更多描述性名称,它们可能如下所示:
template <class ReturnType, class ParameterType>
ReturnType tripleit (ParameterType val)
{
ReturnType temp = val * 3;
return temp; // I assume this line is actually present in your code, it makes no sense otherwise
}
有了这些名字,它应该更清楚一点。该函数可用于将数字乘以3并同时将其转换为所需类型。
使用指定的两个模板参数调用模板只会抑制模板参数推断。我认为真正有趣的案例在那里缺失:
cout << "Explicit double, int; double argument: " << tripleit<double, int>(d) << '\n';
这将传递double
值3.3
。但是,由于ParameterType
被明确指定为int
,因此该值将转换为int
(可能带有警告)。在函数内部,temp
将是double
类型(第一个模板参数),但返回值仍为9,因此预期输出为9
或{{1} }或9.0
,具体取决于浮点数的当前9.0e0
设置。