Boost MPL文档声明boost::map::equal
“如果两个序列Seq1和Seq2在用_element_进行_element_比较时是相同的,则返回一个真值积分常数。
但是,关联序列映射似乎没有检查相等的元素 _wise_。
下面的演示将显示如下: Map2应该等于Map3,这两个值都会在'key‘处增加'int_<1>’value_type。看一下定义Map3的typedef。大小和唯一的元素在演示中被转储:
#include<iostream>
#include<boost/mpl/map.hpp>
#include<boost/mpl/at.hpp>
#include<boost/mpl/insert.hpp>
#include<boost/mpl/erase_key.hpp>
#include<boost/mpl/pair.hpp>
#include<boost/mpl/int.hpp>
#include<boost/mpl/plus.hpp>
#include<boost/mpl/equal.hpp>
#include<boost/mpl/size.hpp>
#include<boost/mpl/front.hpp>
namespace mpl = boost::mpl;
using mpl::int_;
using std::cout;
using std::endl;
using std::is_same;
int main(int argc, char *argv[])
{
typedef int key;
typedef typename mpl::map<mpl::pair<key, int_<1>>> Map;
typedef typename mpl::map<mpl::pair<key, int_<2>>> Map2;
typedef typename mpl::insert<
typename mpl::erase_key<Map,
key>::type,
mpl::pair<key,
typename mpl::plus<int_<1>,
typename mpl::at<Map, key>::type>::type
>::type
>::type Map3;
cout << "equal? " << mpl::equal<Map2,Map3>::type::value << endl;
cout << "size? " << mpl::size<Map3>::value << endl;
cout << "key type at front? " << typeid(mpl::front<Map3>::type::first).name() << endl;
cout << "value type at front? " << mpl::front<Map3>::type::second::value << endl;
cout << "expected size? " << mpl::size<Map2>::value << endl;
cout << "expected key type at front? " << typeid(mpl::front<Map2>::type::first).name() << endl;
cout << "expected value type at front? " << mpl::front<Map2>::type::second::value << endl;
return 0;
}我使用gcc 4.8.1和boost 1.51
发布于 2013-08-15 13:26:13
它不能像预期的那样工作的原因是mpl::plus<int_<1>, mpl::at<Map, key>::type是mpl::integral_constant<int, 2>,而mpl::int_<2>是另一种类型。
工作版本:
typedef mpl::map<mpl::pair<key, mpl::integral_c<int, 1>>> Map;
typedef mpl::map<mpl::pair<key, mpl::integral_c<int, 2>>> Map2;
typedef mpl::insert<
mpl::erase_key<Map, key>::type,
mpl::pair<key, mpl::plus<mpl::integral_c<int, 1>, mpl::at<Map, key>::type>::type>
>::type Map3;发布于 2014-03-18 18:55:27
将元素按不同的顺序插入boost::mpl::map的结果是不同的类型--即使映射是相同的。要解决此问题,您可以在每次修改该序列时对其进行排序,从而重新构建该序列。这大大增加了编译器必须处理的复杂性,特别是在条目数量较大的情况下。
https://stackoverflow.com/questions/18231812
复制相似问题