我曾使用以下类似的方式为我的应用程序编写策略:
策略类如下所示:
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专家来说,这是非常微不足道的。
提前感谢您的帮助。