我正在使用 Boost.Hana 迈出我的第一步,所以请耐心等待。我有

#include <boost/hana.hpp>
namespace hana = boost::hana;
using namespace hana::literals;

#include <string>

struct A
{
  int integer;
  std::string string;
};

int main()
{
  auto tuple = hana::make_tuple(42, "42");
  A a;
  hana::for_each(hana::zip(hana::members(a), tuple), [](auto& element) { element[0_c] = element[1_c]; });
}

这是我尝试将每个元组元素分配给 A 的相应(顺序)成员。这不起作用(有关完整错误,请参阅 live example)。它归结为
main.cpp:19:54: note: candidate function [with $0 = boost::hana::tuple<int, int>] not viable: expects an l-value for 1st argument

 hana::for_each(hana::zip(hana::members(a), input), [](auto& element) { element[0_c] = element[1_c]; });
                                                    ^

我在文档中读到 Hana 算法有 by-value semantics ,但是如何去做这种事情呢?从 A 构建 hana::tuple 是唯一可能的方法吗?

最佳答案

要修改 Struct ,请使用 hana::accessors ,它提供一个 hana::pair 元组,每个元组都有一个键和一个访问器函数。此外,由于我们还没有反射,因此您需要使用 BOOST_HANA_ADAPT_STRUCT 等宏之一将 A 实现为 hana::Struct

另一个答案解决了采用右值的 lambda,因为压缩的元组是一个临时对象。

#include <cassert>
#include <boost/hana.hpp>
namespace hana = boost::hana;
using namespace hana::literals;

#include <string>

struct A
{
  int integer;
  std::string string;
};
BOOST_HANA_ADAPT_STRUCT(A, integer, string);

int main()
{
  auto tuple = hana::make_tuple(42, "42");
  A a;
  hana::for_each(
    hana::zip(hana::accessors<A>(), tuple),
    [&a](auto&& element) {
      auto accessor_pair = hana::at_c<0>(element);
      auto get_member = hana::second(accessor_pair);
      get_member(a) = hana::at_c<1>(element);
    });

  assert(a.integer == 42 && a.string == "42");
}

关于c++ - 如何分配给结构对象的成员?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54226407/

10-13 06:29