преобразовать `boost :: tuple` в` boost :: fusion :: tuple` - PullRequest
0 голосов
/ 05 октября 2018

Мне нужно преобразовать boost::tuple в соответствующий boost::fusion::tuple.Я выяснил соответствующий тип.

Но я ожидаю, что для этого есть встроенная функция.Я действительно не хочу изобретать такие вещи.Я искал в документации Boost Fusion, но не нашел.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вы можете использовать что-то вроде:

template <class Tuple>
auto to_fusion(Tuple&& tuple)
{
    std::apply(
        [](auto&&... args){
            return boost::fusion::make_tuple(decltype(args)(args)...);
        },
        std::forward<Tuple>(tuple));
}
0 голосов
/ 05 октября 2018

версия:

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, который, вероятно, имеет эквивалент усиления.

Живой пример .

...