【问题标题】:boost::mpl::map fails boost::mpl::equal?boost::mpl::map 失败 boost::mpl::equal?
【发布时间】:2013-08-14 12:30:53
【问题描述】:

Boost MPL 文档指出 boost::map::equal

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

但似乎没有检查关联序列映射是否相等元素 _明智_:

下面的演示将显示这一点:Map2 应该等于 Map3,它们都在 'key' 处增加 'int_' 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;
}

我正在使用带有 boost 1.51 的 gcc 4.8.1

【问题讨论】:

  • 另外,mpl 标签与 Boost.MPL 无关。你想要的标签是boost-mpl。如果您添加它,您可能会得到知道他/她在说什么的人的答案。

标签: c++ boost boost-mpl


【解决方案1】:

它不能按预期工作的原因是mpl::plus&lt;int_&lt;1&gt;, mpl::at&lt;Map, key&gt;::typempl::integral_constant&lt;int, 2&gt;,而mpl::int_&lt;2&gt; 是不同的类型。

工作版本:

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;

【讨论】:

  • 你回答了另一个问题,这只是他的问题的附带问题(加号返回的类型与传递的类型不同)。
  • @GrapschKnutsch 我认为你是对的,mpl::map 中的元素顺序是未指定的,mpl::equal 仅适用于此处,因为两个地图都只有一个元素。另一方面,mpl::equal 没有指定任何特定的比较顺序,因此它可以部分专门用于 mpl::map 做正确的事情。不过我没有验证。
【解决方案2】:

在 boost::mpl::map 中以不同的顺序插入元素的结果是不同的类型——即使映射是相同的。 要解决此问题,您可以通过在每次修改序列时对其进行排序来重建序列。这大大增加了编译器必须处理的复杂性, 尤其是条目数较多时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多