1
#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)),但这似乎不必要地冗长。

4

1 回答 1

4

要在 ahana::tuple和 a之间进行转换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::tuplein :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'; });
}
于 2015-12-16T17:09:09.783 回答