4

Boost MPL ドキュメントには、boost::map::equal と記載されています

" _element_で_element_ を比較したときに、2 つのシーケンス Seq1 と Seq2 が同一である場合、真の値の整数定数を返します。

しかし、連想シーケンスマップは要素が等しいかどうかがチェックされていないようです_ 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;
}

ブースト1.51でgcc 4.8.1を使用しています

4

2 に答える 2

2

異なる順序で要素を boost::mpl::map に挿入した結果は、マッピングが同じであっても、異なる型になります。この問題を回避するには、シーケンスを変更するたびに並べ替えて、シーケンスを再構築します。これにより、特にエントリ数が多い場合に、コンパイラが処理しなければならない複雑さが大幅に増します。

于 2014-03-18T18:55:27.380 に答える