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

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

テンプレートが希望の光を投げる

んでは、テンプレートを使ったらどうか?

テンプレートは、ユーザが提供した型に基づいて、コンパイル時点でコードを生成するため、
組み合わせによる様々な動作に対応するための良い素材となります。

うんうん。たしかに、テンプレート引数をいくつか用意することによって、組み合わせを表現することができそうだ。


例えば、SmartPtrの例でいくと、

template <class ThreadModel, class ManageMethod> SmartPtr {...};

とかとか。


そして、templateの特殊化を使えば、ユーザ側で細かいレベルでの動作のカスタマイズもできる。
例えば、

template <class MultiThreaded, class ManageMethod> SmartPtr {...(上記とは違う特殊化された実装)};

とかとか。




しかし、問題点もあるらしい。
細切れだけど眠いので、今日はここまで。続きは、また次回。

おまけ

個人的に、templateの特殊化の復習のコード↓

#include <iostream>

using namespace std;

struct A{
};

struct B{
};

//ジェネリックな実装
template<class T, class U>
struct Hoge {
	void print(){cout << "ジェネリックな実装" << endl;};

	int x;
};

//完全な特殊化
template<>
struct Hoge<A, B> {
	void print(){cout << "完全な特殊化" << endl;};

	int x, y;
};

//部分的な特殊化
template<class U>
struct Hoge<A, U> {
	void print(){cout << "部分的な特殊化" << endl;};

	int x, y, z;
};


int main(){
	Hoge<A, B> ab;//完全な特殊化
	Hoge<A, A> aa;//部分的な特殊化
	Hoge<B, B> bb;//ジェネリックな実装

	ab.print();
	aa.print();
	bb.print();

	return 0;
}