1. functor 仿函数
1.1仿函数和函数对象
-
仿函数(functors,别名function object)是我们最容易自己写,然后融入标准库的部件。只为算法服务。仿函数要模仿函数,必须重载operator(),并且是个class。由此产生的对象称为函数对象,或者叫仿函数(是一个对象,像一个函数)。一般意义上重写了operator()方法的类就是一个仿函数。仿函数的调用包括三种形式:通过构造临时对象调用operator(),通过对象隐式调用operator(),通过对象显示调用operator()。
class Judge { public: bool operator() (int value) { return (0 == value % 2); } }; int main() { Judge judge; int s = 3; // 1. 通过构造临时对象,调用operator()重载函数 cout << judge(s); // 2. 通过对象,隐式调用调用operator()重载函数 cout << Judge().operator()(s); // 3. 通过对象,显示调用operator()重载函数 cout << judge.operator()(s); }
-
每个标准库定义的仿函数都继承了一个东西(unary_function、binary_function),自己定义的仿函数如果没有继承,那就没有融入STL体系结构中。继承了就能被适配器(adapter)去修饰和改造。
-
标准库定义的仿函数继承的类有unary_function、binary_function,unary_function有两个模板参数,其中一个是返回类型;,binary_function有三个模板参数,其中一个是返回类型。另外,这两个模板类仅仅只是将传入的模板参数换个名字。这是因为functor要回答adapter的问题。所以仿函数的可适配的条件是仿函数要继承unary_function或binary_function
namespace test { template <typename T> class less : public binary_function<T, T, bool> { public: bool operator() (const T &x, const T &y) const { return x < y; } }; } void getType(int ) { cout << "int" << endl; } void getType(double ) { cout << "double" << endl; } int main() { //继承binary_function之后,可以调用first_argument_type,second_argument_type,所以有能力回答adapter的提问 typename test::less<int>::first_argument_type x; typename test::less<double>::second_argument_type y; getType(x); getType(y); return 0; }
输出:
int double