c++ - 更新/替换 `boost::hana::map` 中映射值的规范方法

标签 c++ boost metaprogramming c++14 boost-hana

boost::hana::map 中更新值(给定一个键和一个新值)的规范方法是什么? ?

我尝试使用 boost::hana::replace_if但它不适用于 map,因为它不是 Functor - 我可以通过将 map 转换为 来让它工作tuple 然后返回到 map,但这听起来效率很低。

我目前使用的替代方法是调用 map::erase_key其次是 map::insert .

是否有任何我可能遗漏的为此目的设计的replaceupdate 函数?或者这是更新值的“规范”方式?

最佳答案

我认为目前没有规范的方法可以做到这一点。如果有有效的用例,也许我们可以在那里获得一个功能来支持它。 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/

相关文章:

ruby-on-rails - 在函数末尾添加更多代码

c++ - 从可执行文件中读取多个签名

c# - 使用 OpenSSL 兼容格式在 C# 中加密,在 Poco 中解密

c++ - 在 C++ 中实现高效的多线程文件 I/O

c++ - boost::asio - 查看套接字缓冲区

F# 元编程 : is it possible to make IF X = 1 OR 2 syntax?

c++ - 元编程成员检查器不适用于返回具有基类的类型的函数成员

c++ - Qt检查文件签名有效性

c++ - 如何知道 Qt 表单是否有效

python - 无法构建 boost_python 示例代码 "fatal error LNK1181: cannot open input file ' boost_python.lib'"