デフォルトのテンプレート引数: クラス テンプレートに限定される理由
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 サイトの他の関連記事を参照してください。