在 boost::hana::map
中更新值(给定一个键和一个新值)的规范方法是什么? ?
我尝试使用 boost::hana::replace_if
但它不适用于 map
,因为它不是 Functor
- 我可以通过将 map
转换为 来让它工作tuple
然后返回到 map
,但这听起来效率很低。
我目前使用的替代方法是调用 map::erase_key
其次是 map::insert
.
是否有任何我可能遗漏的为此目的设计的replace
或update
函数?或者这是更新值的“规范”方式?
最佳答案
我认为目前没有规范的方法可以做到这一点。如果有有效的用例,也许我们可以在那里获得一个功能来支持它。 hana::erase_key
的问题在于您将创建一个新 map ,然后再次使用 hana::insert
。目前,使用 hana::unpack
然后创建新 map 可能是您最好的选择。
#include <boost/hana.hpp>
namespace hana = boost::hana;
template <typename NewPair>
struct replace_helper_t
{
NewPair const& new_pair;
template <typename Pair>
constexpr decltype(auto) operator()(Pair&& p) const
{
return hana::if_(
hana::equal(hana::first(new_pair), hana::first(p)),
new_pair,
std::forward<Pair>(p)
);
}
};
struct replace_t
{
template <typename Map, typename NewPair>
constexpr auto operator()(Map&& m, NewPair&& new_pair) const
{
return hana::unpack(std::forward<Map>(m),
hana::on(
hana::make_map,
replace_helper_t<NewPair>{std::forward<NewPair>(new_pair)}
)
);
}
};
constexpr replace_t replace{};
int main()
{
auto my_map = hana::make_map(
hana::make_pair(hana::int_c<7>, 7),
hana::make_pair(hana::int_c<13>, 13),
hana::make_pair(hana::int_c<23>, 23)
);
auto new_map = replace(my_map, hana::make_pair(hana::int_c<13>, 14.0f));
BOOST_HANA_RUNTIME_ASSERT(new_map ==
hana::make_map(
hana::make_pair(hana::int_c<7>, 7),
hana::make_pair(hana::int_c<13>, 14.0f),
hana::make_pair(hana::int_c<23>, 23)
)
);
}
另一方面,也许 hana::map
应该是一个 Functor
。
关于c++ - 更新/替换 `boost::hana::map` 中映射值的规范方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37386345/