首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mpl::map失败boost::mpl::equal?

mpl::map失败boost::mpl::equal?
EN

Stack Overflow用户
提问于 2013-08-14 12:30:53
回答 2查看 399关注 0票数 4

Boost MPL文档声明boost::map::equal

“如果两个序列Seq1和Seq2在用_element_进行_element_比较时是相同的,则返回一个真值积分常数。

但是,关联序列映射似乎没有检查相等的元素 _wise_。

下面的演示将显示如下: Map2应该等于Map3,这两个值都会在'key‘处增加'int_<1>’value_type。看一下定义Map3的typedef。大小和唯一的元素在演示中被转储:

代码语言:javascript
复制
#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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-15 13:26:13

它不能像预期的那样工作的原因是mpl::plus<int_<1>, mpl::at<Map, key>::typempl::integral_constant<int, 2>,而mpl::int_<2>是另一种类型。

工作版本:

代码语言:javascript
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2014-03-18 18:55:27

将元素按不同的顺序插入boost::mpl::map的结果是不同的类型--即使映射是相同的。要解决此问题,您可以在每次修改该序列时对其进行排序,从而重新构建该序列。这大大增加了编译器必须处理的复杂性,特别是在条目数量较大的情况下。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18231812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档