如何连接两个 Boost Hana 地图?
How to join two Boost Hana maps?
我有两个 boost::hana::map
要连在一起。
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>)
);
较新版本
(Boost.Hana > 1.2, 提升 >= 1.65)
有boost::hana::union_
函数可以加入boost::hana::map
s。
Returns the union of two maps.
Given two maps xs
and ys
, hana::union_(xs, ys)
is a new map containing all the elements of xs
and all the elements of ys
, without duplicates.
If both xs
and ys
contain an element with the same key, the one in ys
is taken.
还有例子:
// 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'>)
));
完整的交互式示例here on Godbolt在线编译器。
旧版本
(Boost.Hana <= 1.1, 提升 <= 1.64)
基于 some Boost forums topic 的修改示例。
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
完整的交互示例here on Godbolt在线编译器。
该解决方案与最新版本 Boost.Hana 中的解决方案完全相同。
解决 Louis Dionne 的所有学分。
我有两个 boost::hana::map
要连在一起。
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>)
);
较新版本
(Boost.Hana > 1.2, 提升 >= 1.65)
有boost::hana::union_
函数可以加入boost::hana::map
s。
Returns the union of two maps.
Given two maps
xs
andys
,hana::union_(xs, ys)
is a new map containing all the elements ofxs
and all the elements ofys
, without duplicates. If bothxs
andys
contain an element with the same key, the one inys
is taken.
还有例子:
// 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'>)
));
完整的交互式示例here on Godbolt在线编译器。
旧版本
(Boost.Hana <= 1.1, 提升 <= 1.64)
基于 some Boost forums topic 的修改示例。
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
完整的交互示例here on Godbolt在线编译器。
该解决方案与最新版本 Boost.Hana 中的解决方案完全相同。
解决 Louis Dionne 的所有学分。