如何分配给结构对象的成员

How to assign to members of a struct object?

本文关键字:结构 对象 成员 何分配 分配      更新时间:2023-10-16

我正在迈出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成员。这不起作用(有关完整错误,请参阅实时示例)。它归结为

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算法具有按值语义,但是如何去做这种事情呢?从hana::tuple构建A是唯一可能的事情吗?

要就地修改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");
}

我对 Boost 和 Hana 并不熟悉;但我去了他们的网站,阅读了他们关于他们的一些对象、函数等的一些文档。我不知道这是否会对您有所帮助,但我能够稍微修改您的代码,然后我得到了这个来编译:

int main() {
    A a;
    auto tuple = hana::make_basic_tuple( 42, "42" );
    hana::for_each( hana::zip( hana::members(a), tuple), 
                               [&](auto&& element) {
                                   hana::at( tuple, hana::size_c<0> );
                                   hana::at( tuple, hana::size_c<1> );
                               }
                  );
}

我将您的 lambda 更改为具有[&]并将参数更改为auto&&,我使用了 hana::at() .AFAIK 我认为这目前没有分配任何东西,但您可以使用它并从这里开始,但积极的部分是,在您提供的演示代码和相同的编译器设置的同一网站上,这确实编译没有错误。现场演示