用mpl :: map和mpl :: sequence进行boost :: mpl :: fold

时间:2018-07-31 09:07:35

标签: c++ boost

我是boost::mpl的新手,我有一个与boost::mpl::foldboost::mpl::map结合使用boost::mpl::sequence的问题。

我需要确保给定mpl::sequence容器中的类型位于预定义的索引处。因此,我创建了boost::mpl::map的类型和索引,并希望使用boost::mpl::fold来迭代地图。

我知道可以在运行时通过boost::mpl::for_each进行检查,但是我非常有信心可以在编译时完成检查。

这里有一些示例代码:

#include <type_traits>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/map.hpp>
#include <boost/mpl/vector.hpp>

enum class E
{
    e1,
    e2
};

enum class F
{
    f1,
    f2
};

using TypeSequence = boost::mpl::vector<F, E>;

using TypeToIndexMap = boost::mpl::map<
    boost::mpl::pair<E, boost::mpl::int_<1>>,
    boost::mpl::pair<F, boost::mpl::int_<0>>>;

BOOST_MPL_ASSERT_RELATION(boost::mpl::size<TypeToIndexMap>::value,
                          ==,
                          boost::mpl::size<TypeSequence>::value);

using TypeToIndexMappingChecker = boost::mpl::fold<
    TypeToIndexMap,
    boost::mpl::bool_<true>,
    boost::mpl::and_<
        boost::mpl::_1,
        boost::mpl::bool_<std::is_same<
            boost::mpl::first<boost::mpl::_2>::type,
            boost::mpl::at<TypeSequence, 
                           boost::mpl::second<boost::mpl::_2>::type>
            >>
       >
    >::type;

BOOST_MPL_ASSERT((TypeToIndexMappingChecker));

该代码无法编译,因为占位符mpl::_2分别不包含first和second类型。似乎占位符的评估“为时过早”。 我已经玩过boost::mpl::lambda/apply/bind,但最终我总是遇到相同的问题:mpl::_2不包含first和second类型。

0 个答案:

没有答案