3

C++ でクラス T を使用する利点の 1 つは、関数内のデータ型が他の関数 (たとえば int main など) で定義されている場合に、それらのデータ型を再定義する時間を短縮できることです。

template <class T>
void showabs(T number)
{
  if (number < 0 )
    number  = -number;
  cout << number << endl;
  return 0;
}

int main()
{
  int num1 = -4;
  float num2 = -4.23f;

  showabs(num1);
  showabs(num2);

  return 0;
}

したがって、この場合、クラス T を使用しない場合、データ型ごとに対応するデータ型条件を追加する必要があります。つまり、int の場合は別の if ステートメントのセットを、float の場合は別のセットを追加する必要があります。

私は正しいですか?

4

4 に答える 4

14

である必要はありませんclass T。それは、またはあなたが望むものである可能性があります(の代わりにclass Key使用することもできます)。正しい用語は関数テンプレートです。関数テンプレートを使用すると、関数に渡されるすべての型に対して関数を再定義する必要がなくなります。したがって、テンプレートを使用しない場合は、次の 2 つの関数を定義する必要があります。typenameclass

void showabs(float number){
  if (number < 0 ) number  = -number;
  cout << number << endl;
}

void showabs(int number){
  if (number < 0 ) number  = -number;
  cout << number << endl;
}

つまり、多くのコードが繰り返されます。場合によってはvoid*ポインターを使用できますが (これは C でよく見られます)、そうすると、インターフェイスが見にくくなり、型の安全性が失われます。

実際には、2 つの関数呼び出しが

showabs(num1); //showabs<int>(num1);
showabs(num2); //showabs<float>(num2);

実際には、float を受け取る関数と整数を受け取る関数の 2 つの異なる関数を指定します。したがって、テンプレートを使用すると、コンパイラーがコピーと貼り付けを行うことができます (はるかにインテリジェントな方法で)。

于 2010-03-26T10:09:26.390 に答える
1

ifnumberステートメントは、パラメーターの型を宣言するのに役立ちません。showabs処理したい型ごとに関数をオーバーロードする必要があることを意味していたと思います。もしそうなら、はい、あなたは正しい軌道に乗っています。

于 2010-03-26T10:07:20.160 に答える
1

まあ、それは「1つの利点」ではなく、他にもたくさんあります。テンプレートは再利用するために作成されているため、テンプレート化された関数またはクラスを作成時に知らなかった型に使用できます。

于 2010-03-26T10:12:02.923 に答える
1

基本的に、あなたは正しいですが、テンプレート、つまりtemplate-metaprogrammingでできることは他にもたくさんあります。class T用語を明確にするために、typename Foo. class Tはテンプレート パラメータであり、テンプレート パラメータを持つ関数定義は関数テンプレートであり、テンプレート パラメータを持つクラス定義はクラス テンプレートです。

于 2010-03-26T10:12:16.870 に答える