Как соединить две карты Boost Hana? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть два boost::hana::map s для объединения.

constexpr auto m1 = hana::make_map( 
    hana::make_pair("key1"_s, hana::type_c<std::string>), 
    hana::make_pair("key2"_s, hana::type_c<std::string>) 
); 

constexpr auto m2 = hana::make_map( 
    hana::make_pair("key3"_s, hana::type_c<std::string>), 
    hana::make_pair("key4"_s, hana::type_c<std::string>), 
    hana::make_pair("key5"_s, hana::type_c<std::string>) 
); 

Как получить карту, содержащую их оба, как показано ниже?

constexpr auto result = hana::make_map( 
    hana::make_pair("key1"_s, hana::type_c<std::string>), 
    hana::make_pair("key2"_s, hana::type_c<std::string>), 
    hana::make_pair("key3"_s, hana::type_c<std::string>), 
    hana::make_pair("key4"_s, hana::type_c<std::string>), 
    hana::make_pair("key5"_s, hana::type_c<std::string>) 
); 

1 Ответ

0 голосов
/ 13 февраля 2019

Более новая версия

(Boost.Hana> 1.2, Boost> = 1.65)

Есть функция boost::hana::union_ для присоединения boost::hana::map s.

Возвращает объединение двух карт.

Для двух карт xs и ys, hana::union_(xs, ys) - это новая карта, содержащая все элементы xs и все элементы ys, без дубликатов.Если оба элемента xs и ys содержат элемент с одинаковым ключом, берется элемент в ys.

Cite from Boost.Hana docs

Существует также пример:

// Simple example
constexpr auto m1 = hana::make_map(
    hana::make_pair("key1"_s, hana::type_c<std::string>),
    hana::make_pair("key2"_s, hana::type_c<std::string>)
);
constexpr auto m2 = hana::make_map(
    hana::make_pair("key3"_s, hana::type_c<std::string>),
    hana::make_pair("key4"_s, hana::type_c<std::string>),
    hana::make_pair("key5"_s, hana::type_c<std::string>)
);
BOOST_HANA_CONSTANT_CHECK(hana::union_(m1, m2) == hana::make_map(
       hana::make_pair("key1"_s, hana::type_c<std::string>),
       hana::make_pair("key2"_s, hana::type_c<std::string>),
       hana::make_pair("key3"_s, hana::type_c<std::string>),
       hana::make_pair("key4"_s, hana::type_c<std::string>),
       hana::make_pair("key5"_s, hana::type_c<std::string>)
));

// Example with overwriting pair (the same key)
constexpr auto m3 = hana::make_map(
    hana::make_pair(hana::type_c<int>, hana::int_c<1>),
    hana::make_pair(hana::type_c<bool>, hana::bool_c<true>)
);
constexpr auto m4 = hana::make_map(
       hana::make_pair(hana::type_c<char>, hana::char_c<'c'>),
       hana::make_pair(hana::type_c<bool>, hana::bool_c<false>)
);
BOOST_HANA_CONSTANT_CHECK(hana::union_(m3, m4) == hana::make_map(
       hana::make_pair(hana::type_c<int>, hana::int_c<1>),
       hana::make_pair(hana::type_c<bool>, hana::bool_c<false>),
       hana::make_pair(hana::type_c<char>, hana::char_c<'c'>)
));

Полностью рабочий интерактивный пример здесь, на Godbolt онлайн-компилятор.


Старые версии

(Boost.Hana <= 1.1, Boost <= 1.64) </em>

На основе измененного примера из в некоторых форумах по Boost .

constexpr auto map1 = hana::make_map( 
    hana::make_pair(hana::type_c<TwoOtherKeys1>,      hana::type_c<SomeValue>),
    hana::make_pair(hana::type_c<SameKey_SameType>,   hana::type_c<SomeValue>),
    hana::make_pair(hana::type_c<SameKey_DifferType>, hana::type_c<SomeValue>)
);
constexpr auto map2 = hana::make_map( 
    hana::make_pair(hana::type_c<TwoOtherKeys2>,      hana::type_c<SomeValue>), 
    hana::make_pair(hana::type_c<SameKey_SameType>,   hana::type_c<SomeValue>), 
    hana::make_pair(hana::type_c<SameKey_DifferType>, hana::type_c<OtherValue>) 
); 

// Creates result sequence by inserting all of (source) `map1` sequence into (initial) `map1` sequence. 
// Since both sequences are maps with unique keys, keys that exist in both source and initial map got overwrited.
constexpr auto result = hana::fold(map1, map2, hana::insert);

// Excepted result
constexpr auto expected = hana::make_map(
    // Diffrent keys pairs are copied.
    hana::make_pair(hana::type_c<TwoOtherKeys1>, hana::type_c<SomeValue>),
    hana::make_pair(hana::type_c<TwoOtherKeys2>, hana::type_c<SomeValue>),

    // The same key and type pairs are just passed.
    hana::make_pair(hana::type_c<SameKey_SameType>, hana::type_c<SomeValue>),   

    // The same key, differ type - overwrited.
    hana::make_pair(hana::type_c<SameKey_DifferType>, hana::type_c<OtherValue>)
);

// Assertion to confirm exceptation
static_assert(result == expected, ""); // OK

Полностью работающий интерактивный пример здесь, на Godbolt онлайн-компилятор.

Решение работает точно так же, как и в новейшей версии Boost.Hana.


Все кредиты на приобретение Луи Дионна .

...