3

関数テンプレート:

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

それを使用するとき:

max<int>(a, b); // Yeah, the "<int>" is optional most of the time.

しかし、あなたが許せば、このようにテンプレートを書くことができます:

T max<class T>(T a, T b){return (a > b)? a: b;} 
//I know the return type T is not in its scope, don't focus on that.

したがって、同じ形式の宣言を維持し、通常の関数と同じように使用できます。「テンプレート」というキーワードを導入して入力する必要さえありません。クラステンプレートは同じだと思いますか?では、テンプレートを今日私たちが知っているフォームにする他の理由はありますか?

戻り値の型に注目しないようにフォームを変更しました。

auto max<class T>(T a, T b) -> T {return (a > b)? a: b;}
//This is C++11 only and ugly i guess. 
//The type deduce happens at compile time 
//means that return type really didn't to be a problem.
4

4 に答える 4

2

私の頭に浮かぶ直接の答えは次のとおりです。
テンプレートの提案を作成した人がそう言ったからといって、標準委員会の誰もそれらの余分な8文字を入力するのはオーバーヘッドだとは思わなかったからです。

別の注意点:
テンプレートの構文は最初から複雑で威圧的です。キーワードtemplateが存在することを確認すると、C ++またはによって提供される他の獣ではなく、テンプレートを処理していることがコードの読者にとってより直感的になります。実装固有の構造(コンパイラ拡張を読み取る)。

于 2012-05-25T06:07:53.803 に答える
2

使用する前に宣言する必要があるTため、実際には宣言する必要があります

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

しかし、それが何で<class T>あるかは明確ではありません-コンパイラはおそらくそれについて混乱するでしょう. in front は、演算子ではなく、型宣言を囲む中括弧templateであることを明確にします。<

その観点から、2 番目の例は可能であるはずですが、この構文は C++11 でのみ可能であり、テンプレートはずっと前に導入されたことに注意してください。

于 2012-05-25T06:11:09.167 に答える
1

問題はコンパイラの実装の容易さに依存していると私は信じています.C++で使用される名前は、コンパイラが最初から解析できるようにするために使用する前に少なくとも宣言する必要があります(理由はわかりません)。これが、引数の後に戻り値の型を定義できる、関数を宣言するための奇妙な新しい構文がある理由の 1 つです。

したがって、ここでの理由は、あなたの例を読むと、 T が使用される最初の名前ですが、以前に宣言されていないため、コンパイラーはそれが何であるか、またはどのような式に含まれているかわかりません.

于 2012-05-25T06:10:34.310 に答える
1

そのアプローチでは、すぐに問題の解析に取り掛かります。

template <typename> int f(); // Current declaration syntax, type template argument.
template <int> int f();      // Current declaration syntax, non-type template argument.

void f<class>(); // New declaration syntax, type argument. 
void f<int>(); // New declaration syntax, non-type argument.
(void) f<int>(); // (void) is a cast , f is instantiation of f<class> with type int.
于 2012-05-25T07:28:15.717 に答える