将`boost :: tuple`转换为`boost :: fusion :: tuple`

时间:2018-10-05 14:10:42

标签: c++ boost tuples boost-fusion

我需要将boost::tuple转换为相应的boost::fusion::tuple。我已经找到了对应的类型。

但是我希望有一个内置函数可以做到这一点。我真的不想重新发明这种东西。我已经搜索了Boost Fusion文档,但没有找到任何文档。

2 个答案:

答案 0 :(得分:3)

您可能会使用类似的内容:

template <class Tuple>
auto to_fusion(Tuple&& tuple)
{
    std::apply(
        [](auto&&... args){
            return boost::fusion::make_tuple(decltype(args)(args)...);
        },
        std::forward<Tuple>(tuple));
}

答案 1 :(得分:2)

版本:

template<std::size_t...Is, class T>
auto to_fusion( std::index_sequence<Is...>, T&& in ) {
  using std::get;
  return boost::fusion::make_tuple( get<Is>(std::forward<T>(in))... );
}
template<class...Ts>
auto to_fusion( boost::tuple<Ts...> in ) {
  return to_fusion( std::make_index_sequence<::boost::tuples::length< boost::tuple<Ts...>>::value>{}, std::move(in) );
}
template<class...Ts>
boost::fusion::tuple<Ts...> to_fusion( std::tuple<Ts...> in ) {
  return to_fusion( std::make_index_sequence<sizeof...(Ts)>{}, std::move(in) );
}

我不知道内置版本。

中添加尾随-> decltype(boost::fusion::make_tuple( get<Is>(std::forward<T>(in))... ))。您还需要make_index_sequence,它可能具有等效的增强功能。

Live example