ポリシー

C++テンプレートテクニック 6-1


またしても新しい単語が登場。ポリシー。

要約すると同じ関数を持つ別々のクラスを指定できるようにするテンプレートといった感じでしょうか。

#include <iostream>
using std::cout; using std::endl;

template<class T>
void func () {
    T::foo();
}

class CClassA {
public:
    static void foo () { cout << "CClassA" << endl; }
};

class CClassB {
public:
    static void foo () { cout << "CClassB" << endl; }
};

int main () {
    func<CClassA>();
    func<CClassB>();
    return 0;
}
$ main
CClassA
CClassB

fooという関数を持つクラス(もちろん宣言も同じ)であればどんなクラスでもfuncに指定することができます。

また上記ではfunc関数の中でfooを呼び出していますが、実際にはクラスを用意する方が一般的っぽいです。

#include <iostream>
using std::cout; using std::endl;

template<class T>
class CClass {
public:
    void func () {
        T::foo();
    }
};

class CClassA {
public:
    static void foo () { cout << "CClassA" << endl; }
};

class CClassB {
public:
    static void foo () { cout << "CClassB" << endl; }
};

int main () {
    CClass<CClassA> a;
    CClass<CClassB> b;
    a.func();
    b.func();
    return 0;
}