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

它是一个模板类,可以用一个类型参数实例化。所以你可以说greater<int>,greater<my_class>等等。这些实例中的每一个都有一个 operator() ,它接受两个类型的参数const T&并返回比较它们的结果。

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、complexe 对象,代码都是一样的。这就是模板部分的用途。

于 2012-08-27T18:40:46.827 回答