Мы можем использовать структурированные привязки для преобразования структуры в кортеж, немного потрудившись.
Struct-to-tuple очень неудобно.
template<std::size_t N>
struct to_tuple_t;
template<>
struct to_tuple_t<3> {
template<class S>
auto operator()(S&& s)const {
auto[e0,e1,e2]=std::forward<S>(s);
return std::make_tuple(e0, e1, e2);
}
};
Теперь напишите to_tuple_t
для каждого размера, который вы хотите поддерживать. Это становится утомительным. К сожалению, я не знаю, как добавить туда пакет параметров.
template<std::size_t N, class S>
auto to_tuple(S&& s) {
return to_tuple_t<N>{}(std::forward<S>(s));
}
Я также не знаю, как рассчитать требуемое значение N
. Таким образом, вам нужно будет ввести 3
в auto t = to_tuple<3>(my_struct);
, когда вы его вызываете.
Я не мастер структурированных привязок. Вероятно, существует &&
или &
, или decltype, который позволит идеально пересылать следующие строки:
auto[e0,e1,e2]=std::forward<S>(s);
return std::make_tuple(e0, e1, e2);
но без компилятора я буду консервативен и буду делать лишние копии.
Преобразовать кортеж в структуру очень просто:
template<class S, std::size_t...Is, class Tup>
S to_struct( std::index_sequence<Is...>, Tup&& tup ) {
using std::get;
return {get<Is>(std::forward<Tup>(tup))...};
}
template<class S, class Tup>
S to_struct( Tup&&tup ) {
using T=std::remove_reference_t<Tup>;
return to_struct(
std::make_index_sequence<std::tuple_size<T>{}>{},
std::forward<Tup>(tup)
);
}
Поддержка SFINAE, основанная на tuple_size
, может быть полезной для to_struct
.
Приведенный выше код работает со всеми подобными кортежами, такими как std::pair
, std::array
, и всем, что вы настроили для поддержки структурированных привязок (tuple_size
и get<I>
).
Забавно,
std::array<int, 3> arr{1,2,3};
auto t = to_tuple<3>(arr);
работает и возвращает кортеж с 3 элементами, так как to_tuple
основан на структурированных привязках, которые работают с подобными кортежами в качестве входных данных.
to_array
- еще одна возможность в этой семье.
person
Yakk - Adam Nevraumont
schedule
25.07.2016
std::tuple<>
не гарантирует тривиальность, поэтому копирование памяти здесь будет UB. - person ildjarn   schedule 25.07.2016memcpy
звучит как ужасная идея... - person Rerito   schedule 25.07.2016struct
) - person alfC   schedule 29.07.2016