35

C++ の本では、C++ でテンプレートを自由に使用できるのに、関数のオーバーロードを使用するように教えられているのはなぜですか?

テンプレートの効果的な (そして正しい) 使い方を示したほうがよいのではないでしょうか? C ++に関するほとんどの本で関数のオーバーロードが教えられている場所とは対照的に?

または、一方を他方の代わりに使用する正当な理由はありますか?

4

6 に答える 6

34

テンプレートは、異なる可能性がある型に対して同じアクションを実行する場合に役立ちます。簡単な例:

template <typename T>
T foo(const T& a, const T& b) { return a + b; }

タイプに応じて異なる操作を適用する場合は、オーバーロードを使用できます。

struct Foo{ void foo() const {} };

void foo(int i) { std::cout << "i = " << i << "\n"; }
void foo(const Foo& f) { f.foo(); }

テンプレートとテンプレートの特殊化を使用して上記を実現できますが、そのような特殊化は、一般的なケースに対するいくつかの例外を表す必要があります。

于 2012-09-08T14:39:08.733 に答える
8

テンプレートは、さまざまな数の引数を取ることはできません。オーバーロードできます。さらに、テンプレートは、任意のデータ型を操作できることを示していますが、実際には、テンプレートの大部分が (システム内で) 特殊化のみである場合、これを表現しても意味がありません。また、オーバーロードはできますがvirtual、テンプレートの特殊化はできません。また、特殊化の署名がベースと異なることもありません。

template<typename T> void foo(T& t);
template<> void foo<std::string>(std::string* ptr); // Illegal
void foo(std::string* ptr); // Legal

これにより、現在のシステムと比較して、生成できる過負荷の種類が大幅に制限されます。

于 2012-09-08T14:46:18.430 に答える
6

多くの異なるデータ型に対して同じ一連の操作を実行する場合は、通常、テンプレートを使用します。

通常、特定のデータ セットに対してさまざまな操作を実行する場合は、関数のオーバーロードを使用します。

多くの異なるデータ型に対して同じ一連の操作を実行したい状況でのテンプレートの利点は、テンプレート化された関数を使用して将来作成する可能性のある新しい型をコンパイル時にコンパイラが処理することです。関数のオーバーロードを使用する場合は、特定の関数に渡したい新しい型を作成するたびに、新しい関数のオーバーロードを作成する必要があります。

于 2012-09-08T14:36:58.697 に答える
3

juanchopanzaの答えへの追加:

関数のオーバーロードを使用すると、便利な引数の数を変更することもできます。

次の宣言を持つ関数がある場合の簡単な例:

void foo(int i, int j);

しかし、最初の引数 0 を指定して foo を呼び出すことがよくあります。次の関数を記述して、入力の手間を省くことができます。

void foo(int j) {
  foo(0, j);
}
于 2012-09-08T14:52:06.130 に答える
2

テンプレートでは、(通常) 同一の構文を使用して、すべての (サポートされている) タイプで操作を実行する必要があります。

関数のオーバーロードも同様に使用されます (または使用する必要があります) が、異なる構文を使用して異なる型の操作を実行できます。つまり、(必須ではありませんが) さまざまな方法で値を表すことができます。明らかな例の 1 つは、C ライブラリでatanand と呼ばれるものです。atan2では、「上昇」と「ラン」の比率を渡しatan、その比率が表す角度を返します。atan2より多くの入力データを使用すると、より完全な結果も得られます)。

これらは C で完全に別個の関数として実装されていますが、最初から C++ で記述されている場合はatan、1 つのパラメーターと 2 つのパラメーターの両方にオーバーロードされた単一の名前 (たとえば、) を使用することが完全に適切です。

double atan(double);           // equivalent to current atan
double atan(double, double);   // equivalent to current atan2

テンプレート (テンプレート自体が提供するものをほとんどオーバーライドするだけの特殊化を除く) は、このような呼び出し構文の違いを提供しません。

オーバーロードもより制約されます。サポートする特定の型ごとに 1 つのオーバーロードを提供します (ただし、ポインターまたは参照を使用する場合は、それらも派生型をサポートできます)。テンプレートを使用すると、単一のテンプレートを (少なくとも潜在的に)任意の型に適用できます。

于 2012-09-08T14:46:21.270 に答える
1

したがって、overloadingとの両方templateが同等に使用されます。

differenceそれらについての1行は次のとおりです。

overloadingさまざまな機能があり、SIMILAR操作を行うときに使用されます。

templateさまざまな機能があり、IDENTICAL 操作を行うときに使用されます。

There is very big differnce between "SIMILAR" and "IDENTICAL".

于 2020-01-30T08:23:11.220 に答える