Non penso che al momento ci sia un modo canonico per farlo. Se ci sono casi d'uso validi per questo, forse potremmo ottenere una funzione in là per supportarlo. Il problema con hana::erase_key
consiste nel fatto che creerai una nuova mappa e poi di nuovo con hana::insert
. Per il momento, usare hana::unpack
e quindi creare una nuova mappa è probabilmente la scelta migliore.
#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)
)
);
}
In un'altra nota, forse hana::map
dovrebbe essere un Functor
.
fonte
2016-05-23 22:16:41
Credo che tu abbia bisogno del tuo 'hana :: hash (hana :: first (new_pair)) == hana :: hash (hana :: first (p))' test per essere 'hana :: equal (hana :: primo (new_pair), hana :: first (p)) '. Altrimenti, se sostituisci il valore associato a una chiave il cui hash si scontra con qualsiasi altra chiave nella mappa, sostituirai il valore di tutte le chiavi che condividono lo stesso hash anche se le chiavi sono diverse. Fondamentalmente sostituirai il valore di tutte le chiavi nello stesso bucket. E un nitpick, ma usare 'hana :: equal' potrebbe essere migliore di' == 'per il codice generico perché funzionerà con, ad es. 'Std :: integral_constant'. –
Ah, giusto. Ho corretto il mio esempio e modificato anche il tipo del valore per dimostrare che non si tratta semplicemente di mutare il valore. –