我正在尝试使用boost-mpl的地图容器进行基于策略的设计POC。 (code here)
我使用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文档mentions at模板的三参数重载。看起来它不在#include <boost/mpl/at.hpp>
。我甚至通过增强代码搜索了这个重载,没有成功。我发现的唯一模板是带有两个参数的模板。我在搜索这个问题时失败了(“at”太常见了。)
它是一个提升文档错误,还是有人发现如何在超载时使用此mpl ::
答案 0 :(得分:1)
只有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>
>
{ }