1. ホーム
  2. c++

[解決済み] 関数テンプレートのデフォルトのテンプレート引数

2022-04-13 16:54:02

質問

なぜデフォルトのテンプレート引数は、クラステンプレートにしか許されないのですか? なぜ、メンバー関数テンプレートではデフォルトの型を定義できないのですか? 例えば

struct mycclass {
  template<class T=int>
  void mymember(T* vec) {
    // ...
  }
};

その代わり、C++ではデフォルトのテンプレート引数はクラステンプレート上でしか許されないことを強制しています。

解決方法は?

デフォルトのテンプレート引数を与えることは理にかなっています。例えば、ソート関数を作ることができます。

template<typename Iterator, 
         typename Comp = std::less<
            typename std::iterator_traits<Iterator>::value_type> >
void sort(Iterator beg, Iterator end, Comp c = Comp()) {
  ...
}

C++0xではC++に導入されています。Bjarne Stroustrup氏によるこの不具合報告を参照してください。 関数テンプレートのデフォルトのテンプレート引数 とのことです。

関数テンプレートのデフォルトテンプレート引数の禁止は、独立した関数が二流市民として扱われ、すべてのテンプレート引数を指定するのではなく、関数引数から推測する必要があった時代の忘れられた名残である。

この制限により、自立型関数とメンバ関数を不必要に区別することになり、STLスタイルのコードを書きにくくなるため、プログラミングスタイルが著しく損なわれます。