インスタンスメンバを利用したポリシー

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といったポリシークラス側でもメンバ変数で値を格納したりすることができます。