热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OGRE中Policy设计

Policy和PolicyClasses有助于我们设计出更加安全,有效率且具有高度弹性的“设计元素”。所谓Policy,是用来定义一个class或者cl

Policy Policy Classes有助于我们设计出更加安全,有效率且具有高度弹性的“设计元素”。所谓Policy,是用来定义一个class或者class template的接口,该接口以下项目之一或者全部组成:内隐类型定义,成员函数,成员变量。

template struct OpNewCreator { static T* Create() { return new T; } }; template struct MallocCreator { static T* Create() { void* pBuf = std::malloc( sizeof( T ) ); if( !pBuf ) return 0; return new( pBuf ) T; } }; template struct PrototypeCreator { PrototypeCreator( T* pObj == 0 ) : pPrototype_( pObj ) { } T* Create() { return pPrototype_ ? pPrototype_->Clone():0; } T* GetPrototype() { return pPrototype_; } void SetPrototype( T* pObj ) { pPrototype_ = pObj; } private: T* pPrototype_; }

Policies接口和一般传统的classes接口(纯虚函数集)不同,它比较松散,因为Policies是语法导向而非标记导向,比如:Creator明确定义的是“怎样的语法构造符合其所规范的class”,而非“必须重写哪些函数”,例如Creator Policy并没有规范Create()必须是静态的或者是虚函数,它只要求class必须定义出Create(),此外规定Create()应该(但非必须)传回一个指向新对象的指针。

如果又下面一个类设计需要适用Policy作为其基础类:

template class WidgetManager : public CreationPolicy { };

 

当具体实例化的时候我们必须传进去一个他所期望的Policy:

typedef WidgetManager<OpNewCreator<Widget> > MyWidgetMgr;

但是PolicyTemplate引数往往是多余的&#xff0c;因为实例化的对象往往已经在定义之前就已经确定了他的操作对象&#xff0c;比如上面的WidegManager总是操作Widget对象&#xff0c;所以完全没有必要每次实例化的时候再进行传入操作&#xff0c;这样既多余而且危险。

这个时候程序库可以使用“Template Template参数“来描述Policies&#xff0c;如下&#xff1a;

template