我正在使用 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/