6 仿函数
~~~~~~~~~
6.1 把仿函数类设计为可被用于值传递
===================================
1. 函数对象类似于函数指针,STL的习惯是当传给函数和从函数返回时函数对象是通过值传递的
2. 如果函数对象是引用传递,有些STL算法的实现甚至不能编译
3. 因为函数对象以值传递和返回,你的任务就是确保当那么传递(也就是拷贝)时你的函数对象行为良好.这暗示了两个东西:
* 你的函数对象应该很小,否则它们的拷贝会很昂贵.
* 你的函数对象必须单态(也就是非多态)——它们不能用虚函数.那是因为派生类对象以值传递代入基类类型的参数会造成切割问题.
4. 然而多态对于仿函数来说也是很有用处的,另外如果仿函数需要保留的状态太多也必然照成仿函数过大.这时需要一种曲线的方式.
这时可以带着你要放进你的仿函数类的数据和/或多态,把它们移到另一个类中。然后给你的仿函数一个指向这个新类的指针。
通过指针指向一个实现类的方式,结果是仿函数类是小而单态的,但可以访问大量状态而且行为多态。
最重要的东西是使用这种技术的仿函数类必须支持合理方式的拷贝
6.2 用纯函数做判断式
=====================
1. 纯函数是返回值只依赖于参数的函数.
2. STL算法可能会拷贝仿函数,这样可能存在仿函数的多个副本,并且各个副本的状态可能不一致,若仿函数的判断结果与状态有关,则算法产生的结果未知.
6.3 考虑使用函数对象代替函数作为算法的参数
===========================================
1. 把STL函数对象——化装成函数的对象——传递给算法所产生的代码一般比传递真的函数高效。
2. 另一个用函数对象代替函数的原因是它们可以帮助你避免细微的语言陷阱。