#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方法是什么?我意识到我可以使用:hana::make_tuple(std::ref(x), std::ref(y), std::ref(z)),但这似乎不必要地冗长。

最佳答案

要在hana::tuplestd::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,对吗?目前无法实现,请参阅this。但是,您可以简单地在std::tuple中使用hana::for_each,只要您包含上面的适配器 header 即可:
#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'; });
}

关于c++ - STL和Hana元组之间的转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34317634/

10-15 08:58