我是boost::mpl
的新手,我有一个与boost::mpl::fold
和boost::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类型。