デフォルトのテンプレート引数: クラス テンプレートに限定される理由
デフォルトのテンプレート引数によって提供される利便性にもかかわらず、不思議なことに、それらはクラス テンプレートに限定されています。このため、プログラマはなぜメンバ関数テンプレートに適用できないのか疑問に思うことになります。
関数テンプレートのデフォルトのテンプレート引数の引数
メンバを持つ my_class の例を考えてみましょう。 function template:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
メンバー関数テンプレートで T のデフォルトの型を指定することは、直感的には理にかなっています。ただし、C では、デフォルトのテンプレート引数はクラス テンプレートにのみ許可されるという制限が適用されます。
制限の背後にある理由
この制限は、独立した関数が使用されていた歴史的な理由に由来しています。メンバー関数より劣ると考えられます。すべてのテンプレート引数を関数の引数から強制的に推論することで、一貫した処理が保証されました。
関数テンプレートにおけるデフォルトのテンプレート引数の将来
C 0x は制限を認識しました既存の制限の。関数テンプレートにデフォルトのテンプレート引数を含めることで、コーディングの柔軟性が向上し、STL プログラミング スタイルと一致します。
この変更の支持者である Bjarne Stroustrup 氏によれば、関数テンプレートのデフォルトのテンプレート引数の禁止は「間違って生まれた」残り物。」彼は、独立関数とメンバー関数を不必要に区別するため、コード内の一貫性を維持することが困難になると主張しています。
関数テンプレートのデフォルト テンプレート引数の利点
デフォルトのテンプレート引数を関数テンプレートに組み込むことで、より合理化された直感的なコーディング エクスペリエンスが可能になります。たとえば、sort 関数の場合を考えてみましょう。
<code class="cpp">template<typename Iterator, typename Comp = std::less< typename std::iterator_traits<Iterator>::value_type> > void sort(Iterator beg, Iterator end, Comp c = Comp()) { ... }</code>
Comp のデフォルトのテンプレート引数を使用すると、明示的なコンパレータの有無にかかわらず、sort 関数を呼び出すことができ、構文が簡素化され、コードの可読性が向上します。
以上がデフォルトのテンプレート引数が C のクラス テンプレートのみに制限されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。