読者です 読者をやめる 読者になる 読者になる

ポリシークラスってなんぞや?〜その6〜

というわけで、ざっくりまとめると、多重継承とテンプレートを組み合わせることによって、とてつもない柔軟性をもったライブラリを作ることが可能なんだと。それの構成要素としてポリシーってものを定義する。
ってことなんだと思います。

続きの1章1.5節で具体例を見てまとめ。

1章1.5節 ポリシーとポリシークラス

まずは、ポリシーの定義

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

ってことらしいです。
僕が先ほど述べた「多重継承とテンプレートを組み合わせることによって、」という内容は書いてない。しかし、この本のポリシークラスは、全部テンプレート引数で渡してそれを継承という使い方をしてた気がするんだけどなぁ。「多重継承とテンプレートを組み合わせること」は必須ではないのかなぁ。



分からないので、飛ばして載ってた具体例。
Creatorポリシー。オブジェクトの生成方法を記述したポリシー。

new使い版

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


malloc & placement new 版

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

プロトタイプ・オブジェクトをクローンする版

template <class T>
struct PrototypeCreator{
	PrototypeCreator(T* pObj = 0) : pPrototype_(pObj){
	}
	T* Create()
	{
		return pPrototype_? pPrototype_->Clone() : 0;
	}
	T* GetPrototype() {return pPrototype_;}
	void SetPrototype(T* pObj) { pPrototype_ = pObj; }
private:
	T* pPrototype_;
};

実際これらをどのように使うかというと、

template <class CreationPolicy>
class WidgetManager : public CreationPolicy{
	...
}

ポリシーを使う上記のようなクラスをホストクラスというらしいです。
ホストクラスは、ポリシーの構造や、動作の組み立てに責任を持ってます。

んで、実体化する際には、

typedef WidgetManager< OPNewCreator<Widget> > MyWidgetMgr;

等とします。

WidgetManagerは実装の一部をユーザーに解放しており、非常に柔軟で便利です。

っと駆け足で、見てきましたが、最終的に概念を理解するには、

Strategyデザイン・パターンを一ひねりしてコンパイル時にバインドするようにしたものとも言えます。

という一言が直感的に理解しやすいのかも。僕も、これで、なんとなく理解した気になりました。

しかし、実際ポリシーを使ったコードを組んでみないと、理解は深まらなそうです。日々のコーディングで使ってみたいと思います。
お粗末な記事ですいませんでしたm(_ _)m