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;
}

これは2つのintを取り、それらを合計します。それらを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タイプに変換し、その変換された値Tに追加bして、結果をに割り当てtます。Tが組み込みタイプの場合T(a)、標準の変換またはキャストを使用します。ユーザー定義の場合は、フォームのコンストラクターを使用しますT(int)

tすぐに再割り当てされるため、最初の行には意味がありません。関数は、次のようにより明確に記述できます。return T(a)+b;

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

これにより、戻り型が、の関数テンプレートがインスタンス化され、doubleが呼び出されます。全体的な効果はまたはと同じnSum = double(120) + 200;です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パラメータとしてをとるコンストラクタを呼び出しintます。

于 2012-09-21T18:30:55.213 に答える