template <class T> struct greater : binary_function <T, T, bool> {
bool operator() (const T& x, const T& y) const {
return x > y;
}
};
我在 STL 库中找到了“用于大于不等式比较的函数对象类”的定义。有人可以向我解释一下这段代码是如何工作和编译的吗?
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);
它是一个模板类,可以用一个类型参数实例化。所以你可以说greater<int>
,greater<my_class>
等等。这些实例中的每一个都有一个 operator() ,它接受两个类型的参数const T&
并返回比较它们的结果。
greater<int> gi;
if (gi(1, 2)) {
// won't get here
} else {
// will get here
}
我不知道你对模板编程和仿函数了解多少。
让我们从函子开始:
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 对象,代码都是一样的。这就是模板部分的用途。