3

私はこのコードを持っています:

template <class T>
T GetMax (T a, T b) {
  return (a>b?a:b);
}


int main () {
  int i=51, j=26, k;
  long l=100, m=15, n;
  k=GetMax(i,j);
  n=GetMax(l,m);
  cout << k << endl;
  cout << n << endl;
  return 0;
}

変数kとnのデータ型を変更して、戻り値を受け入れるのに十分な動的になるようにするにはどうすればよいですか。戻り値がdoubleの場合、kとnは自動的にdoubleになるため、intまたはdoubleのどちらを渡すかを気にする必要はありません。

オンラインや本で検索してみましたが、うまくいきませんでした。Plzが私を助けてくれますか?テンプレートは初めてです。

4

3 に答える 3

9

C ++ 11では、次を使用できますauto

auto k = GetMax(i,j);
auto n = GetMax(l,m);

およびのタイプはknそれらを初期化するために使用される式から推測されます。

C ++ 11より前は、型を明示的に指定する必要がありました。ただし、引数の型を知っているので、常に何らかの形式で型を記述できる必要があります。

于 2013-03-22T18:34:22.777 に答える
2

できませんが、する必要はありません。

GetMaxは、渡されたタイプがわかっているコンテキストで常に呼び出されるため、戻りタイプが何であるかがわかります。

たとえば、2つのintを渡すと、結果はintになります。ダブルとロングを渡すとダブルになります。

テンプレートはタイプセーフなマクロと考えてください。関数の呼び出しを、置換された型を持つ関数の本体に置き換えます。これにより、関数が実行されます。

于 2013-03-22T18:35:45.877 に答える
1

参照を使用して、動作しない場合にコンパイラに警告させることができます。

template <class T>
void GetMax (T a, T b, T& output) {
  output = (a>b?a:b);
}

ただし、C ++ 11を使用できる場合は、auto代わりに使用してください。

于 2013-03-22T19:33:16.797 に答える