gpt4 book ai didi

c++ - 如何使用 boost::mpl 编写策略?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:53 24 4
gpt4 key购买 nike

我使用了类似下面的东西来为我的应用程序编写策略:

策略类如下所示:

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 专家来说是微不足道的。

提前致谢。

最佳答案

由于没有人满意地回答这个问题,我花了一些时间深入研究 boost::mpl 源代码。伙计,宏层和数百行特化类并不漂亮。我现在更加感谢 boost 库的作者让元编程对我们来说更容易和更便携。希望 C++0x 也能让库编写者的生活更轻松。

无论如何,这个解决方案简单而优雅。

首先 iter_fold 不是我想要的,因为我无法弄清楚如何指定一个可以被引用为 null 类型的迭代器。所以我摆弄了 fold 并找到了以下内容:

typedef fold<Policies, Null, Cons<_1, _2> >::type MyPolicy;

为了让它工作,我需要提供 Null 类型和 Cons 的特化:

struct Null { };

template<class PolicyT>
struct Cons<Null, PolicyT> {
static void init() { PolicyT::init(); }
static void cleanup() { PolicyT::cleanup(); }
};

关于c++ - 如何使用 boost::mpl 编写策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/256702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com