ホームページ >バックエンド開発 >C++ >デフォルトのテンプレート引数が C のクラス テンプレートのみに制限されているのはなぜですか?

デフォルトのテンプレート引数が C のクラス テンプレートのみに制限されているのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-27 13:35:29555ブラウズ

Why Are Default Template Arguments Restricted to Only Class Templates in C  ?

デフォルトのテンプレート引数: クラス テンプレートに限定される理由

デフォルトのテンプレート引数によって提供される利便性にもかかわらず、不思議なことに、それらはクラス テンプレートに限定されています。このため、プログラマはなぜメンバ関数テンプレートに適用できないのか疑問に思うことになります。

関数テンプレートのデフォルトのテンプレート引数の引数

メンバを持つ 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。