1.5.1 運用Template Template參數實作Policy Classes
如前例,庫代碼host class如果已知policy class,那么可以這樣描述:
1
2 //Library code
3 template < template < class Created > class CreationPolicy >
4 class WidgetManager : public CreationPolicy<Widget>{};
因為Created只是形式引數(formal argument),不可使用,可以省略如下:
1
2 template < template < class > class CreationPolicy >
3 class WidgetManager : public CreateionPolicy<Widget>{};
客戶代碼為:
1 typedef WidgetManager<OpNewCreator> MyWidgetMgr;
當WidgetManager希望在內部以相同的生成策略產生一個內部對象,那么這種template template形式不可或缺。
Policy的確能夠帶給WidgetManager非常大的彈性。第一,可以外部變更policies。第二,可以自定義policies。
WidgetManager的作者可以定義一些常用的policies,以“template 缺省引數”的方式提供:
1
2 template < template < class > class CreationPolicy = OpNewCreator >
3 class WidgetManager 
.
1.5.2 運用Template 成員函數實作Policy Classes
我們可以把先前的Creator policy定義為一個非模板類,內部提供一個模板成員函數如下:
1
2 struct OpNewCreator
3 {
4 template < class T >
5 static T* Create()
6 {
7 return new T;
8 }
9 }
10
這種方式對舊式編譯期有較佳兼容性。但難以討論、定義、實作和運用。
1.6 更豐富的Policies
在前例的Creator policy中PrototypeCreateor除了提供Create()成員函數外,還提供了GetProtoType和SetProtoType兩個函數,由于WidgetManager繼承了policy class,所以WidgetManager具有此兩個接口,雖然它自己并沒有用。
客戶代碼可以如此:
1
2 typedef WidgetManager<PrototypeCreator> MyWidgetManager;
3 /////////
4 widget* pPrototype =
;
5 MyWidgetManager mgr;
6 mgr.SetPrototype(pPrototype);
使用者如果需要擴充policies,可以在不影響host class原本功能的前提下,增加接口。“哪個policy被使用”由使用者決定而非程序庫自身。policies給與使用者一種能力,在型別安全的前提下擴增host class的功能。