2013-08-14 7 views
4

подталкивания MPL документации говорится, что повышение :: Карта :: равныйboost :: mpl :: map failed boost :: mpl :: equal?

«Возвращает истинное многозначных Интегральная постоянная, если две последовательности Seq1 и SEQ2 идентичны, когда по сравнению _element_ по _element_.

но мне кажется, что карта последовательности ассоциативно не проверяется на равенство элемента _ мудрой _:

следующая демонстрация покажет это: Map2 должен быть равен Map3, которые оба увеличивают значение 'int_ < 1>' value_type в 'key'. Посмотрите на typedef, определяющий Map3. Размер и единственный элемент сбрасывается п демо:

#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 с повышением 1,51

+1

Также тег [tag: mpl] не связан с Boost.MPL. Тег, который вы хотите, - [tag: boost-mpl]. Вероятно, вы получите ответ от того, кто знает, о чем он говорит, если вы его добавите. – llonesmiz

ответ

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; 
+0

Вы ответили на другую проблему, которая связана только с его проблемой (что плюс возвращает другой тип, чем передан). –

+0

@GrapschKnutsch Я думаю, вы правы, что порядок элементов в 'mpl :: map' не указан, и здесь работает только' mpl :: equal', потому что обе карты имеют только один элемент. С другой стороны, 'mpl :: equal' не указывает какой-либо конкретный порядок сравнений, поэтому он может быть частично специализирован для' mpl :: map', чтобы делать правильные вещи. Однако я этого не проверял. –

2

В результате вставки элементов в другом порядке в буст :: MPL :: карта различные типы - даже если отображение такое же. Чтобы обойти эту проблему, вы можете перестроить последовательность, отсортировав ее каждый раз, когда вы ее модифицируете. Это значительно усложняет сложность, с которой компилятор должен иметь дело, особенно, если количество записей больше.

Смежные вопросы