首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

对《强大的C++——把乘法变成加法》的补充说明解决办法

2012-03-01 
对《强大的C++——把乘法变成加法》的补充说明在前文中,限于篇幅,我没有探讨policy技术的一个关键特性。这个特

对《强大的C++——把乘法变成加法》的补充说明
在前文中,限于篇幅,我没有探讨policy技术的一个关键特性。这个特性是policy区别于其他技术的关键点。
考虑MyDBAccessor的定义:
template <class   Cursor,   class   Binder,   class   RowBuffer>
class   MyDBAccessor
:   public   Cursor,   public   Binder,   public   RowBuffer
{

};
请注意,MyDBAccessor继承自Cursor、Binder和RowBuffer,并且,都是public的。于是,Cursor、Binder和RowBuffer的public成员都成了MyDBAccessor的成员。因此,MyDBAccessor <FastForwardCursor,   DynamicBinder,   SingleRowBuffer> 拥有了以下成员函数:
bool   MoveNext();
bool   MoveLast();
bool   GetData(const   string&   field,   void**   data);
bool   GetData(int   field,   void**   data);
bool   SetData(const   string&   field,   void*   data)   {…}
bool   SetData(int   field,   void*   data)   {…}
//DynamicBinder由于是自动的,所以不需要额外的public成员函数。
//SingleRowBuffer处理默认的情况,也没有额外的public成员函数。
而MyDBAccessor <DynamicCursor,   ManualBinder,   BulkBuffer> 的成员函数:
bool   MoveNext();
bool   MovePre();
bool   MoveLast();
bool   MoveFirst();
bool   GetData(const   string&   field,   void**   data);
bool   GetData(int   field,   void**   data);
bool   SetData(const   string&   field,   void*   data)   {…}
bool   SetData(int   field,   void*   data)   {…}
vector <col_info>   GetColumnInfo();//继承自ManualBinder
void   SetBindInfo(const   vector <bind_info> &   bi);//继承自ManualBinder
void   SetBulkBufferSize(size_t   sz);//继承自SingleRowBuffer
比较个模板类的成员,我们会发现,MyDBAccessor的成员取决于模板参数(policy)。这也就提示我们,可以通过定制模板实参(policy)上的成员函数,改变MyDBAccessor的接口和功能。
这在其他方式,如包容方式中,是做不到的。在这些方式中,我们只能在设计时尽可能多地让主类MyDBAccessor覆盖所有可能的接口形式。当我们需要扩展这个体系时,受到主类接口的限制,无法提供超越接口的扩展。
而policy方式不同。因为主模板MyDBAccessor继承自每个模板实参,那么,我们只需定制模板实参,就可以改变MyDBAccessor的接口形式,并扩充其功能。这使得这个体系的扩充更加容易,更加灵活。甚至是MyDBAccessor的使用者也能对其进行扩展。这就是policy相比其他方式的优越性。
不知我说清楚了没有。


[解决办法]
好文,不过现在理解的还不算很深刻

热点排行