具有明确规范类型的函数模板

时间:2013-11-30 14:39:16

标签: c++ function-templates

我正在尝试理解下面的示例代码。 我知道我们可以显式指定数据类型但不确定“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

1 个答案:

答案 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';

这将传递double3.3。但是,由于ParameterType被明确指定为int,因此该值将转换为int(可能带有警告)。在函数内部,temp将是double类型(第一个模板参数),但返回值仍为9,因此预期输出为9或{{1} }或9.0,具体取决于浮点数的当前9.0e0设置。