对《强大的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相比其他方式的优越性。
不知我说清楚了没有。
[解决办法]
好文,不过现在理解的还不算很深刻