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

STLライブラリで「大なり不等比較用関数オブジェクトクラス」の定義を見つけました。このコードがどのように機能し、コンパイルされるかを誰かに説明してもらえますか?

4

3 に答える 3

4
template <class T> // A template class taking any type T
// This class inherit from std::binary_function
struct greater : binary_function <T, T, bool>
{
  // This is a struct (not a class).
  // It means members and inheritens is public by default

  // This method defines operator() for this class
  // you can do: greater<int> op; op(x,y);
  bool operator() (const T& x, const T& y) const {
    // method is const, this means you can use it
    // with a const greater<T> object
    return x > y; // use T::operator> const
                  // if it does not exist, produces a compilation error
  }
};

ここに定義がありますstd::binary_function

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

これにより、binary_function を定義する型にアクセスできます

greater<int> op;
greater<int>::result_type res = op(1,2);

これはと同等です

std::result_of<greater<int>>::type res = op(1,2);
于 2012-08-27T18:42:14.797 に答える
0

これは、1 つの型引数でインスタンス化できるテンプレート クラスです。greater<int>したがって、、、などと言うことができますgreater<my_class>。これらのインスタンス化のそれぞれには、型の 2 つの引数を取り、const T&それらを比較した結果を返す operator() があります。

greater<int> gi;
if (gi(1, 2)) {
    // won't get here
} else {
    // will get here
}
于 2012-08-27T18:40:46.410 に答える
0

テンプレートプログラミングとファンクターについてあなたが知っていることはあまりありません。

ファンクターから始めましょう:

struct greater {
  bool operator()(const int& x, const int& b) const {
    return x > y;
}

greater g;
g(2,3); // returns false
g(3,2); // returns true

したがって、ファンクターは、bool g(int x, int y){return x>y;} を実装して同じように使用できる関数をモックします。

ファンクターの良いところは、より複雑なデータ構造で作業するときにデータを保存できることです。

次に、テンプレート部分があります。どのタイプに対しても同じファンクターを記述したい場合、タイプが int、float、complex オブジェクトのいずれであっても、コードは同じになります。それがテンプレート部分です。

于 2012-08-27T18:40:46.827 に答える