Преобразования между кортежами STL и Hana

#include <boost/hana.hpp>
#include <iostream>
#include <tuple>

namespace hana = boost::hana;

int main()
{
int x{7};
float y{3.14};
double z{2.7183};
auto t = hana::to<hana::tuple_tag>(std::tie(x, y, z));
hana::for_each(t, [](auto& o) { std::cout << o << '\n'; });
}

Как хана это сделать? Я понимаю, что могу использовать: hana::make_tuple(std::ref(x), std::ref(y), std::ref(z)), но это кажется излишне многословным.

1

Решение

Для преобразования между hana::tuple и std::tupleнужно сделать std::tuple действительная последовательность Hana. поскольку std::tuple поддерживается из коробки, вам просто нужно включить <boost/hana/ext/std/tuple.hpp>, Следовательно, следующий код работает:

#include <boost/hana.hpp>
#include <boost/hana/ext/std/tuple.hpp>
#include <iostream>
#include <tuple>
namespace hana = boost::hana;

int main() {
int x{7};
float y{3.14};
double z{2.7183};
auto t = hana::to<hana::tuple_tag>(std::tie(x, y, z));
hana::for_each(t, [](auto& o) { std::cout << o << '\n'; });
}

Обратите внимание, что вы также можете использовать hana::to_tuple для менее многословия:

auto t = hana::to_tuple(std::tie(x, y, z));

Это, как говорится, так как вы используете std::tie, вы, вероятно, хотите создать hana::tuple содержащие ссылки, верно? Сейчас это невозможно этот по причине. Тем не менее, вы можете просто использовать std::tuple в hana::for_eachпри условии, что вы включите заголовок адаптера выше:

#include <boost/hana.hpp>
#include <boost/hana/ext/std/tuple.hpp>
#include <iostream>
#include <tuple>
namespace hana = boost::hana;

int main() {
int x{7};
float y{3.14};
double z{2.7183};
auto t = std::tie(x, y, z);
hana::for_each(t, [](auto& o) { std::cout << o << '\n'; });
}
3

Другие решения

Других решений пока нет …