Как назначить членам объекта структуры?
Я делаю свои первые шаги с Boost. Хана, поэтому, пожалуйста, потерпите меня. я имею
#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 имеют семантику по значению, но как тогда поступить так? Строит A
от hana::tuple
единственно возможное?
2 ответа
Чтобы изменить Struct
на месте, использовать hana::accessors
который обеспечивает кортеж hana::pair
s каждый с ключом и функцией доступа. Кроме того, поскольку у нас пока нет отражения, вам нужно использовать один из макросов, таких как BOOST_HANA_ADAPT_STRUCT
реализовать A
как hana::Struct
,
Другой ответ обращается к лямбде, принимающему значение, потому что сжатый кортеж является временным объектом.
#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> );
}
);
}
Я изменил вашу лямбду, чтобы иметь [&]
и изменил параметр, чтобы быть auto&&
и я использовал hana::at()
, AFAIK Я не думаю, что это что-то назначает в данный момент, но вы могли бы использовать это и перейти отсюда, но положительным моментом является то, что на том же веб-сайте вы предоставили свой демо-код и с теми же настройками компилятора, это сделало скомпилировать без ошибок. Live Demo