C/C++的标准库函数遵循的规则:函数指针按值传递的
由于函数对象往往按值传递和返回的,所以,你编确保编写的函数对象在经过传递后还能正常工作。
意味着:
1、首先,你的函数对象必须尽可能的小,否则拷贝开销会非常大
2、函数对I想不能是多态的,即不能是虚函数。(传递过程中会产生剥离问题)
解决多态的函数子的方法:将所需的和虚函数从函数子类中分离出来,放到一个新的类中;然后再函数子类中包含一个指针,指向这个新类。(桥接模式)
代码如下:
template<typename T>
class BPFCImpl
public unary_function<T,void>{
private:
Widget w;
int x;
...
virtual ~BPFCImpl();
virtual void operator(const T& val) const;
friend class BPFC<T>; //允许BPFC访问自己的数据
}
template<typename T>
class BPFC: //新的BPFC类,短小非多态
public unary_function<T,void>{
private:
BPFC<T>* pImpl; //BPFC唯一的数据成员
public: //现在是一个非虚的函数,将调用转到BPFCImpl中
void operator()(const T& val) const
{
pImpl->operator()(val);
}
}