2014-09-29 3 views
3

Я хочу создать associative sequence с двух типов boost::fusion::map. Типы, содержащиеся в одной из карт, могут существовать в другой, и если это так, я хочу, чтобы в конечном итоге был только один тип с этим ключом в полученной последовательности. То есть, я хочу, чтобы клавиши были уникальными после присоединения.Как присоединиться к двум или более картам слияния?

Обычная операция join позволяет дублировать ключи, поэтому это не похоже на решение. Кто-нибудь знает, как я могу это достичь?

// Here is what I've got: 
using namespace boost::fusion; 
map< 
    pair<int, int>, 
    pair<double, int>> Map1; 

map< 
    pair<bool, int>, 
    pair<double, int>> Map2; 

// I want to join Map1 with Map2 such that I have 
static_assert(std::is_same<Map3, map< 
    pair<int, int>, 
    pair<double, int>, 
    pair<bool, int>>>::value, ""); 

ответ

3

Вы, вероятно, придется ликвидировать простофили вручную: в полном C++ 14 шестерней Live On Coliru

auto r = 
    as_map(
     fold(
      fold(m1, m2, [](auto accum, auto elem) { return erase_key<typename decltype(elem)::first_type>(accum); }), 
      m1, 
      [](auto accum, auto elem) { return insert(accum, boost::fusion::end(accum), elem); } 
     )); 

Это обалденный. Если вы замените его функторов вместо лямбды вы бы в конечном итоге похожие на:

auto r = 
    as_map(
     fold(
      fold(m1, m2, erase_corresponding()), 
      m1, 
      insert_helper() 
     )); 

Простая реализация Live On Coliru еще опирается на предварительно C++ 1Y поддержка:

struct erase_corresponding { 
    template<typename T, typename U> 
     auto operator()(T map, U elem) const { 
      return boost::fusion::erase_key<typename U::first_type>(map); 
     } 
}; 

struct insert_helper { 
    template<typename T, typename U> 
     auto operator()(T map, U elem) const { 
      return boost::fusion::insert(map, boost::fusion::end(map), elem); 
     } 
}; 

Однако, чтобы сделайте все это C++ 03 доказательством, вам нужно будет указать его с RESULT_OF (который я оставляю в качестве упражнения для читателя)

+0

только что понял, что вторая складка может быть упрощена в простое соединение сейчас :) – sehe

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

  • Нет связанных вопросов^_^