Seasons.NET

ちょっとした技術ブログです

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