我正在使用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
到唯一可能吗?
答案 0 :(得分:3)
要在适当位置修改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");
}
答案 1 :(得分:0)
我对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我现在不认为这是分配任何东西,但是您可能可以使用它,然后从这里继续,但是积极的一点是,在您提供的演示代码和相同的编译器设置的同一网站上,这样做编译没有错误。 Live Demo