19

20.8.5§1によるstd::lessと、メンバー関数を持つクラステンプレートです。

template<typename T>
struct less
{
    bool operator()(const T& x, const T& y) const;
    // ...
};

つまり、たとえば、テンプレートをインスタンス化するときにタイプについて言及する必要がありますstd::less<int>std::less代わりにメンバー関数テンプレートを持つ通常のクラスではないのはなぜですか?

struct less
{
    template<typename T, typename U>
    bool operator()(const T& x, const U& y) const;
    // ...
};

std::less次に、type引数を使用せずにアルゴリズムに渡すだけで、問題が発生する可能性があります。

初期のコンパイラは(おそらく)メンバー関数テンプレートを十分に(またはまったく)サポートしていなかったため、これは歴史的な理由によるものですか、それとももっと深いものがありますか?

4

3 に答える 3

28

これは、インスタンス化されたテンプレートによって作成されたクラスに、ファンクターの結果タイプと引数タイプに関するタイプ情報を提供するネストされたtypedefが含まれるようにするためです。

  template <class Arg1, class Arg2, class Result>
  struct binary_function 
  {
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
  };

  template <class T> 
  struct less : binary_function <T,T,bool> 
  {
    bool operator() (const T& x, const T& y) const;
  };

std::lessから継承しstd::binary_function、これらのtypedefを生成します。したがって、たとえば、を使用して結果タイプを抽出できますstd::less<T>::result_type

現在、これはC++11decltypeautoキーワードではほとんど不要です。

于 2012-12-13T20:36:47.480 に答える
9

これが、C++98で行った方法です。テンプレートと転送について理解が深まったので(14年以上の経験があります)、新しい関数型はあなたが言ったことを実行します。関数呼び出し演算子はテンプレート関数です。

于 2012-12-13T20:36:39.000 に答える
1

operator()前回の会議で受け入れられた、そのようなすべての関数オブジェクトがポリモーフィックになるようにこれを変更するというStephanの提案は私の理解です。

したがって、「関数呼び出し演算子がテンプレート化されていないのはなぜですか?」という質問に対する答えは、テンプレート化されているということです。

于 2012-12-13T21:53:33.093 に答える