ホームページ  >  記事  >  バックエンド開発  >  C のメンバー関数テンプレートにデフォルトのテンプレート引数を使用できないのはなぜですか?

C のメンバー関数テンプレートにデフォルトのテンプレート引数を使用できないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 12:38:01895ブラウズ

Why Can't Default Template Arguments Be Used for Member Function Templates in C  ?

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

C では、デフォルトのテンプレート引数はクラス テンプレートにのみ許可されます。この制限により、なぜそのような引数をメンバー関数テンプレートに定義できないのかという疑問が生じます。

次の例を考えてみましょう:

<code class="cpp">struct my_class {
  template<class T = int>
  void mymember(T* vec) {
    // ...
  }
};</code>

この例では、デフォルトの型を定義しようとしています。メンバー関数テンプレート内のテンプレート パラメーター T の場合、この構文は C では許可されません。代わりに、デフォルトのテンプレート引数はクラス テンプレートに厳密に制限されます。

制限の背後にある理由

関数テンプレートのデフォルト テンプレート引数の禁止は、歴史的な理由から生じています。 C の初期のバージョンでは、独立した関数は言語のテンプレート システムに完全には統合されていませんでした。より慣用的であると考えられるメンバー関数テンプレートの使用を促進するために、デフォルトのテンプレート引数はクラス テンプレートに制限されました。

しかし、この制限はメンバー関数テンプレートを不必要に区別するため、制限として認識されるようになりました。および独立した関数テンプレート。 Bjarne Stroustrup が欠陥レポートで指摘したように:

「関数テンプレートのデフォルトのテンプレート引数の禁止は、誤って生み出された名残です...[それ] メンバ関数とは異なる独立した関数を不必要に作成することで、プログラミング スタイルを著しく窮屈にさせます。 ."

C 0x Update

これらの懸念に応えて、C 0x は独立した関数テンプレートにデフォルトのテンプレート引数を導入しました。この変更により、テンプレート プログラミングの柔軟性と一貫性が向上します。

次の C 0x コードを考えてみましょう。

<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 テンプレート パラメーターにデフォルトのテンプレート引数が指定されており、並べ替えアルゴリズムがデフォルトで標準の Less 比較関数を使用できるようになります。

以上がC のメンバー関数テンプレートにデフォルトのテンプレート引数を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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