Tôi không nghĩ rằng hiện tại có một cách kinh điển để thực hiện việc này. Nếu có trường hợp sử dụng hợp lệ cho điều này, có lẽ chúng ta có thể nhận được một chức năng trong đó để hỗ trợ nó. Vấn đề với hana::erase_key
là bạn sẽ tạo một bản đồ mới và sau đó lại với hana::insert
. Hiện tại, việc sử dụng hana::unpack
và sau đó tạo bản đồ mới có lẽ là đặt cược tốt nhất của bạn.
#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)
)
);
}
Ghi chú khác, có lẽ hana::map
phải là Functor
.
Nguồn
2016-05-23 22:16:41
Tôi tin rằng bạn cần 'hana :: hash (hana :: first (new_pair)) == hana :: hash (hana :: first (p))' test là 'hana :: equal (hana :: đầu tiên (new_pair), hana :: đầu tiên (p)) '. Nếu không, nếu bạn thay thế giá trị được liên kết với khóa có mã băm va chạm với bất kỳ khóa nào khác trong bản đồ, bạn sẽ thay thế giá trị cho tất cả các khóa chia sẻ cùng một mã băm ngay cả khi các phím khác nhau. Về cơ bản bạn sẽ thay thế giá trị cho tất cả các khóa trong cùng một nhóm. Và một nitpick, nhưng việc sử dụng 'hana :: equal' có thể tốt hơn' == 'cho mã chung vì nó sẽ hoạt động với ví dụ. 'std :: integral_constant'. –
Ah, đúng vậy. Tôi đã sửa ví dụ của mình và cũng đã thay đổi loại giá trị để chứng minh rằng nó không chỉ đơn giản là biến đổi giá trị. –