1.9 结合Policy Classes
当你将policies组合起来时,便是它们最有用的时候。举例,若我们整打算设计一个泛型的smart pointer。我们分析有两个policies:threading model(多线程模型)和check before dereference (提领前先检验),于是可以这样定义SmartPtr模板类。
1
2 template < Class T,
3 template <class> class CheckingPolicy,
4 template <class> class ThreadingModel
5 >
6 class SmartPtr;
我们可以这样使用:
1
2 typedef SmartPtr<Widget, EnforceNoNull, Singlethreaded> SafeWigetPtr;
或者,
1 typedef SmartPtr<Widget, NoChecking, SingleThread> WidgetPTr;
一旦你设法把一个class分解成正交的policies,便可利用少量的代码涵盖大多数行为。
1.10 以Policy Classes 定制接口
templates的限制之一,你无法定制class的结构,只能定义其行为。而policy-based design支持结构方面的定制。
通过一个结构指针或者引用的聚合,或者依靠于继承。都可以。
1.11 Policies的兼容性
假设有两个SmartPtr:FastWidgetPtr是一个不需要检验的指针,SafeWidgetPtr则必须在提领(dereference)前检验。你能将一个FastWidgetPtr对象指派(赋值)给一个SafeWidgetPtr对象吗?
Policies之间的彼此转换,最好的方法是以Policy来控制SmartPtr对象之间的拷贝和初始化。如:
1 template<Class T, template<class> class CheckingPolicy>
2 class SmartPtr : public CheckingPolicy<T>
3 {
4 //
5 template<class T1, template<class> class CP1>
6 SmartPtr(const SmartPtr<T1, CP1>& other>
7 : pointee_(other.pointee_), CheckingPolicy<T>(other)
8 {//}
9 };
本节后续内容从略
1.12 将一个Class分解为一堆Policies
1.13 摘要