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―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術
posted with amazlet on 06.11.21