1

任意の型の数値、int、double などで呼び出すことができるテンプレート関数を作成しました...

この関数を呼び出すには、数値を知る必要があり、この数値を取得するには、コンソールから読み取ります ( std::cin)。

とにかく関数に渡すために変数の型を宣言する必要がある場合、テンプレートを使用する目的は何ですか? つまり、渡したい数値のタイプをユーザーに尋ねることはありません。また、関数を異なる方法で呼び出すために、すべてのデータ タイプに対してスイッチ ループを実行することもありません。

何かが十分に明確でない場合は、簡単な例を挙げてみましょう。

template <typename T>
T sum(T a, T b)
{
   return a + b;
}

int main()
{
   using namespace std;
   int a, b; // here, this line

   cout << "Provide first number: ";
   cin >> a;
   cout << "Provide second number: ";
   cin >> b;
   sum(a, b);
}

loadVariable()のような別のテンプレート関数を作成し、ロードされた変数を次のように返すことを考えていました。

template <typename T>
T loadVariable(string text)
{
   T var = new T;
   cout << text;
   cin >> var;
   return var;
}

そして、次のようなことをしてください:

int main()
{
   using namespace std;
   sum(loadVariable("Provide first number: "), loadVariable("Provide second number: ");
}

ただし見た目がかなり悪いです。

この種の関数を使用することは良い習慣ですか?

それとも、私が気付いていない他のクールな方法があるのでしょうか?

4

4 に答える 4

3

テンプレートは、開発と保守の観点からコードの重複を回避するのに役立ちます (ただし、コンパイラーは各専門分野のコードを生成します) また、テンプレート メタプログラミングを使用したランタイム タスクに対して、さまざまなコンパイル タイム タスクを実行するためにも使用されます。

C++ は静的に型付けされるため、型はコンパイル時に認識されている必要があるため、宣言する必要があります。多くの型の 1 つを含むことができるクラスについては、boost::variant を参照してください。

ここでのテンプレートに関する質問は、静的に型付けされた言語と動的に型付けされた言語の問題であると思います。私はそれを確認していませんが、テンプレートパラメーターが指定されておらず、コンパイラーが呼び出し自体から特殊化を導出できないため、loadVariable() の概念はコンパイルされないと思います。テンプレート パラメータが指定されている場所loadVariable<int>()または場所が必要です。loadVariable<double>()

問題は、整数型と浮動小数点型を区別する必要があるかどうかです。入力変数を double として宣言できるため、どちらも含むことができます。

これは投稿の例としてのコードかもしれませんが、この関数はメモリ リークですか?

template <typename T>
T loadVariable(string text)
{
   T var = new T;
   cout << text;
   cin >> var;
   return var;
}
于 2013-04-20T14:47:35.897 に答える
1

sumテンプレートを使用するポイントは、コードの別の場所で2 つの異なる型変数を使用したい場合があることです。もちろん、コードが非常に単純でsum、 typesintでのみ呼び出すことがわかっている場合は、 definesumを使用intして、テンプレートの代わりに s を取得することもできます。

テンプレート引数を指定する必要があるため、説明したように2番目の例loadVariableは機能しません。

sum(loadVariable<float>("Provide first number: "), loadVariable<float>("Provide second number: "));

もちろん、次のように書くこともできます。

float a = loadVariable<float>("Provide first number: ");
float b = loadVariable<float>("Provide second number: ");
sum(a, b);

テンプレートの引数は、コンパイル時に認識されている必要があります。テンプレートはコンパイル時の構造です。コードのある時点で、関数に渡す引数の型をいつでも知ることができます。テンプレート関数のポイントは、型が何らかの形で変化する変数を受け入れないことです。タイプは変更できません。それらはコンパイル時の構造でもあります。テンプレート関数のポイントは、さまざまな型の関数の一般的な実装を提供して、プログラム全体のさまざまな場所で呼び出すことができるようにすることです。

于 2013-04-20T14:03:13.367 に答える