【发布时间】:2010-09-20 09:06:28
【问题描述】:
我已使用以下内容为我的应用程序编写策略:
策略类如下所示:
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 专家来说是微不足道的。
提前致谢。
【问题讨论】:
标签: c++ templates metaprogramming boost-mpl