Function Objects
函数对象的定义:可以使用函数调用语法进行调用的任何对象。
如果一个类或者结构A实现了ResultType operator()(Parameters)方法(即重载了函数调用操作符),当客户编写代码如A()时,其实就是通过默认构造函数创建了A的对象,然后调用上面的这个operator()方法。
函数对象拥有几个优点:
1)因为函数对象可以有成员变量,因此可以在构造函数中初始化成员变量,因此与一般函数相比,函数对象拥有状态。这主要带来的是灵活性。
比如函数Func接受一个函数对象的引用A,然后调用A(),客户可以预先创建不同的函数对象,比如A(1),A(2)(假设A类构造函数接受int参数),然后依次交给Func函数回调。如果只是一个普通的函数,因为没有状态是做不到这么灵活的回调的。
2)函数对象是一个类,如果将函数对象作为一个模板参数,可以指定某种行为,如果是传递给容器类的话,容器类也会因为模板参数的不同而不同。而函数指针无法做到这点。
关于这点,可以参考<<C++ Templates 中文版>>22.4.2节。
3)函数对象的性能比函数指针高。
函数调用有直接调用,间接调用和内联调用。内联调用概念不用再说,性能很高。直接调用的意思是指令中已经包含了函数的入口地址,而间接调用通常还需要在运行时才能确定调用拿一个函数。如果通过函数名调用,就是直接调用,如果通过函数指针调用,通常会导致间接调用。函数对象通常会产生直接调用或者内联调用,因此性能比函数指针高。