CG@CPPBLOG

/*=========================================*/
随笔 - 76, 文章 - 39, 评论 - 137, 引用 - 0
数据加载中……

《C++设计新思维》读书笔记(五)


 
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 摘要
 
 

posted on 2007-12-17 22:09 cuigang 阅读(327) 评论(0)  编辑 收藏 引用 所属分类: 《C++设计新思维》读书笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理