仿函数类的设计原则:数据量小,单态
// 用于修改的BPFC的新实现类
template<typename T>
class BPFCImpl : public unary_function<T, void> {
private:
// 以前在BPFC里的所有数据现在在这里
Widget w;
int x;
...
// 多态类需要虚析构函数
virtual ~BPFCImpl();
virtual void operator()(const T& val) const;
// 让BPFC可以访问这些数据
friend class BPFC<T>;
};
// 小的,单态版的BPFC
template<typename T>
class BPFC : public unary_function<T, void> {
private:
// 这是BPFC唯一的数据
BPFCImpl<T> *pImpl;
public:
// 现在非虚;调用BPFCImpl的
void operator()(const T& val) const {
pImpl->operator() (val);
}
...
};
BPFC::operator()的实现例证了BPFC所有的虚函数是怎么实现的:它们调用了在BPFCImpl中它们真的虚函数。结果是仿函数类(BPFC)是小而单态的,但可以访问大量状态而且行为多态。
1、这个例子体现了Pimpl惯用法
2、必须保证BPFC的拷贝构造函数对指向的BPFCImpl对象做了合理的事情。也许最简单的合理的东西是引用计数,使用类似Boost的shared_ptr,