38 遵循按值传递的原则来设计函数子

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);
	 }
}

猜你喜欢

转载自blog.csdn.net/weixin_28712713/article/details/80922588
38
今日推荐