備忘録 @ ウィキ

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;
}

目安箱バナー