次のようなものを使用して、アプリケーションのポリシーを作成しました。
ポリシー クラスは次のようになります。
struct Policy {
static void init();
static void cleanup();
//...
};
template <class CarT, class CdrT>
struct Cons {
static void init() {
CarT::init();
CdrT::init();
}
static void cleanup() {
CdrT::cleanup();
CarT::cleanup();
}
//...
};
ポリシーを作成するには:
typedef Cons<Policy1, Cons<Policy2, Cons<Policy3, Policy4> > > MyPolicy;
MyPolicy を使用するには:
init_with<MyPolicy>(...);
//...
cleanup_with<MyPolicy>(...);
彼らが呼び出す場所:
MyPolicy::init_options(); // calls Policy1 to 4's init in order
と
MyPolicy::cleanup(); // calls Policy1 to 4's cleanup in reverse order
基本的に、Cons はここで型リストを作成します。それはかなり簡単です。ただし、typedef の cons 行はちょっと見づらいです。これを行うことができるポリシー コンバイナーがあると理想的です。
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy;
任意の数のポリシーを設定できるため、CombinePolicy には C++0x での可変個引数テンプレートのサポートが必要です。これは最先端のコンパイラで実験的にのみ利用可能です。ただし、boost:mpl ライブラリは、一連の前処理のトリックを使用して問題を解決/回避したようです。私は次のようなものを使用できると思います:
typedef mpl::list<Policy, Policy2, Policy3, Policy4> Policies;
そして、次を呼び出します。
init_with<Policies>(...);
次に使用します:
typedef iter_fold<Policies, begin<Policies>::type,
some_magic_lambda_expression>::type MyPolicy;
明らかに、ここでsome_magic_lambda_expressionを理解するのに少し苦労しています。ここでは、mpl の専門家にとっては非常に些細なことだと思います。
前もって感謝します。