Modern C++ Design勉強日記 テンプレートでポリシーを使おう!!(1)
動作、構造の専門を受け持つ(ポリシー)を用いることで、それを継承したホスト側を
いつでも変更させることができるのがポリシーを使うメリット。
通常の継承では継承の種類が増える程、クラスを実装しなくてはいけないですが、
テンプレートを使えば、テンプレート引数を変更するだけで利用したいポリシーを変更することが
できるのです。
この例では、継承先のクラスでは、Createを要求します。
継承先では当然ながら、Createを実装せず、受け取ったポリシーの
Createを利用することになります。
#include "stdafx.h" using namespace std; template <typename T> class OpNewPolicy { public: static T* Create( void ) { cout << "OpNewPolicy" << endl; T* p = new T; if ( !p ) { return 0; } return p; } static void Delete( void* pMem ) { delete (T*)pMem; } }; template <typename T> class OpMallocPolicy { public: static T* Create( void ) { cout << "OpMallocPolicy" << endl; T* p = (T *)malloc( sizeof(T) ); if ( !p ) { return 0; } return p; } static void Delete( void* pMem ) { free( pMem ); } }; template < template <class> class CreatePolicy = OpNewPolicy > class Host : public CreatePolicy<int> { public: }; #ifdef __TEST_TMP2_1 AUTO_TEST( tmp2_1 ) { Host<> h1; // 引数が空の時は、デフォルトで指定したポリシーが適用される void* p = h1.Create(); h1.Delete( p ); Host< OpMallocPolicy > h2; // Mallocポリシーを利用すると明示的に指定 p = h2.Create(); h2.Delete( p ); } #endif