備忘録 @ ウィキ
Policy
最終更新:
mlnk
-
view
Policyクラス
継承を使用した場合、実行する仮想関数は実行時に解決される(動的多態性)のに対し、
Policyクラスを使用するとコンパイル時に解決される(静的多態性)。
つまり、Policyクラスを使用するとコンパイル時間を犠牲にパフォーマンスを向上できる。
(まあ仮想関数のオーバーヘッドがどれくらいか実測してないから知らないが)
その他の利点として外部から動作を拡張できる点も挙げられる。
注意点として、Policyクラスのデストラクタはprotected非仮想にしなければならない。
(Policyクラスのポインタでdeleteさせない & 仮想関数のオーバーヘッドを防ぐため)
例
struct PolicyA
{
void func1() {
std::cout << "A's func1" << std::endl;
};
protected:
~PolicyA() {};
void DoFunc2() {
std::cout << "A's func2" << std::endl;
};
};
struct PolicyB
{
// PolicyBにのみ実装している関数
void func() {
std::cout << "B's func" << std::endl;
};
void func1() {
std::cout << "B's func1" << std::endl;
};
protected:
~PolicyB() {};
void DoFunc2() {
std::cout << "B's func2" << std::endl;
};
};
template <class policy>
struct PolicyHolder : public policy
{
void func2() {
std::cout << "call func2" << std::endl;
policy::Dofunc2();
};
};
int main()
{
PolicyHolder<PolicyA> a;
PolicyHolder<PolicyB> b;
a.func1();
b.func1();
a.func2();
b.func2();
b.func(); // 問題なし
return 0;
}