1章 1.5 ポリシーとポリシー・クラス - Modern C++ Designを読む(1)

ポリシーやポリシー・クラスは、安全で効率のよい、そしてカスタマイズ性の高い設計用素材の実装を支援するものです。
ポリシー(policy)とは、クラス・インターフェースやクラス・テンプレートのインターフェースを定義するものです。
インターフェースは内部型の定義、メンバ関数、メンバ変数によって構成されます。

全然分からねぇぇぇぇ。
というわけでサンプルコードを写経しよう。(一部変えてます)

Hello Worldクラス

class HelloWorld
{
public:
    void say()
    {
        printf("Hello, World!\n");
    }
};

Policyを2つ用意

template <class T>
struct OpNewCreator
{
    static T* Create()
    {
        return new T;
    }
};

template <class T>
struct MallocCreator
{
    static T* Create()
    {
        void* buf = malloc(sizeof(T));
        if (!buf) return 0;
        return new (buf) T;
    }
};


まずは単体でPolicyを使ってみる。
意図しない使いかたなので、深入りはしない。

    // 1.単体でOpNewCreatorを使ってみる
    OpNewCreator<HelloWorld> hogeCreateor;
    HelloWorld* h = hogeCreateor.Create();
    h->say();

    // 2.単体でMallocCreatorを使ってみる
    MallocCreator<HelloWorld> hogeCreateor2;
    HelloWorld* h2 = hogeCreateor2.Create();
    h2->say();


次にHellowWorldManagerのPolicyを開発者(ユーザー)が指定できる版。
HelloWorldManagerの動作を開発者(ユーザー)が外から変えられる&それが静的に決まるから安全ということかな?

template <class CreatePolicy>
class HelloWorldManager : public CreatePolicy
{
};

// 3.Managerのpolicyに OpNewCreator を使う
HelloWorldManager< OpNewCreator<HelloWorld> > manager;
HelloWorld* h3 = manager.Create();
h3->say();


HelloWorldManagerをインスタンス化するときに OpeNewCreatorと指定するのは冗長だから、こんな感じで。
そろそろ頭がヒートしてきた。

template <template <class Created> class CreatePolicy>
class HelloWorldManager2 : public CreatePolicy<HelloWorld>
{
};

// 4. 3は OpNewCreatorにHelloWorldを指定しているのが冗長
HelloWorldManager2<OpNewCreator> manager2;
HelloWorld* h4 = manager2.Create();
h4->say();


デフォルトパラメータを指定できる。<>で合っているのかな?

template <template <class Created> class CreatePolicy = OpNewCreator>
class HelloWorldManager3 : public CreatePolicy<HelloWorld>
{
};

// 6. policyにデフォルト値テンプレート引数をあたえることもできる
HelloWorldManager3<> manager4;
HelloWorld* h6 = manager3.Create();
h6->say();

完全に静的な、Strategyパターンみたいな感じ?
まだメリットが分からないけども写経は理解の助けになるみたい。


Modern C++ Design読書会の目次→こちら


Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術
アンドレイ アレキサンドレスク Andrei Alexandrescu 村上 雅章
ピアソンエデュケーション
売り上げランキング: 22597