インスタンスメンバを利用したポリシー
C++テンプレートテクニック 6-4
前回の記事ではstaticメンバ関数を使用したポリシークラスの実装になっていました。
今回はインスタンスメンバを使用した場合のポリシーについてです。
#include <iostream> using std::cout; using std::endl; template<class Policy> class CClass { private: Policy m_policy; public: void func () { m_policy.foo(); } }; class CClassA { private: int m_num; public: CClassA () : m_num(1) {} void foo () { cout << "CClassA:" << m_num << endl; } }; class CClassB { private: int m_num; public: CClassB () : m_num(2) {} void foo () { cout << "CClassB:" << m_num << endl; } }; int main () { CClass<CClassA> a; CClass<CClassB> b; a.func(); b.func(); return 0; }
$ main CClassA:1 CClassB:2
CClassにポリシークラスをメンバ変数として持ちます。これにより、CClassAやCClassBといったポリシークラス側でもメンバ変数で値を格納したりすることができます。