2

显式模板参数规范的总结

template<class T>
T max(T t1, T t2)
{
   if (t1 > t2)
      return t1;
   return t2;
}
max<double>(120, 14.55);   we explicitly determine the type of T as double 

我理解上面的部分。

下面,有点不一样

 template<class T>
T SumOfNumbers(int a, int b)
{
   T t = T(); // ???

   t = T(a)+b;  //??? 

   return t;
}

这需要两个整数,并将它们相加。尽管在 int 本身中对它们求和是合适的,但此函数模板提供了根据调用者要求以任何类型计算总和(使用 operator+)的机会。例如,以 double 形式获取结果,您可以将其称为:

double nSum;
nSum = SumOfNumbers<double>(120,200);    //  ???

我了解“显式模板参数规范”主题。但是,这里的条件不同,bcs 函数模板的参数类型已经是确定的。

我无法理解符号“???”之前的行 ?

你能逐步向我解释一下吗?这条线会发生什么

nSum = SumOfNumbers<double>(120,200); 

120 是否将 120.0 即从 int 转换为 double ?

什么 T(a) ?这是什么意思?

参考: http: //www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1

4

2 回答 2

4
T t = T();

t通过值初始化进行初始化。对于内置算术类型,它的值为零;对于用户定义的类型,它使用默认构造函数进行初始化。

(学究式地,它是通过复制或移动一个值初始化的临时值来初始化的,因此如果没有可用的复制或移动构造函数,这将失败;实际上复制或移动将被省略)。

t = T(a)+b;

转换a为 type T,添加b到转换后的值,并将结果分配给t。如果T是内置类型,T(a)则将使用标准转换或强制转换;如果它是用户定义的,那么它将使用 form 的构造函数T(int)

第一行没有意义,因为t将立即重新分配。该函数可以更清楚地写为return T(a)+b;

nSum = SumOfNumbers<double>(120,200);

这将使用返回类型实例化函数模板double,并调用。整体效果与nSum = double(120) + 200;or相同nSum = 220.0

于 2012-09-21T18:29:24.227 回答
4
T t = T(); // This creates a new object of type T inefficiently though, I think it actually creates a temporary one and then calls the copy-constructor.

nSum = SumOfNumbers<double>(120,200); // This calls your function with type parameter double with parameter 120 and 200. This means it will compile a version of SumOfNumbers where T is "substituted" by double

T(a)调用T以 aint作为参数的构造函数。

于 2012-09-21T18:30:55.213 回答