Boost MPL文档声明boost :: map :: equal
“如果两个序列Seq1和Seq2,则返回一个真值积分常数 当比较 _element_ _element_时,它们是相同的。
但似乎未检查关联序列图是否相等元素 _ 明智 _:
以下演示将显示:Map2应该等于Map3,它们都会增加'int_< 1>' 'key'的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
答案 0 :(得分:3)
它无法正常工作的原因是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;
答案 1 :(得分:2)
将元素以不同的顺序插入到boost :: mpl :: map中的结果是不同的类型 - 即使映射是相同的。 若要解决此问题,您可以通过每次修改它时对其进行排序来重建序列。这大大增加了编译器必须处理的复杂性, 特别是如果条目数量较大。