2

我正在尝试使用 boost-mpl 的地图容器进行基于策略的设计的 POC。(代码在这里)

我使用 mpl::map 传递我的策略,默认情况下它是空的:

typedef boost::mpl::map<> DefaultPolicy;

为了获得该政策,我尝试了以下方法:

typedef typename boost::mpl::at<TPolicy, LogPK, DefaultLogP>::type LoggingPolicy;

相反,我在使用 g++ 4.81(以及使用 clang++ 3.3 的等效错误)时收到以下错误:

main.cpp:49:61: error: wrong number of template arguments (3, should be 2)
    typedef typename boost::mpl::at<TPolicy, LogPK, DefaultLogP>::type LoggingPolicy;
                                                               ^

boost 文档提到了 at 模板的三个参数重载。看起来它不在#include <boost/mpl/at.hpp>. 我什至通过 boost 代码搜索了这个重载,但没有成功。我发现的唯一模板是带有两个参数的模板。我在谷歌上搜索这个问题失败了(“at”太常见了)。

这是一个提升文档错误,还是有人发现如何使用这个 mpl::at 重载?

4

1 回答 1

2

只有2型版本。不幸的是,该文档是错误的,并且一直存在。但你总是可以自己动手

template <typename Seq, typename Key, typename Def>
struct at_def
: mpl::eval_if<
    typename mpl::has_key<Seq, Key>::type,
    mpl::at<Seq, Key>,
    mpl::identity<Def>
    >
{ }
于 2013-08-30T23:37:49.193 回答