如何将值元组中的相应值附加到相同类型的向量元组中

How to append the corresponding value from a tuple of values to a tuple of vectors of the same types?

本文关键字:元组 同类型 向量      更新时间:2023-10-16

我有一个数组类的结构

template <typename... Ts>
class soa {
std::tuple<std::vector<Ts>...> vectors;
void push_back(std::tuple<Ts...> values);
}

我希望push_back将值的元组推送到每种类型的每个对应向量上。我想用index_sequences做点什么,但我不太确定如何正确地进行包扩展。

这正是我所想的,但扩展不起作用。我应该如何正确地进行扩展?

template <typename... Ts>
class soa {
std::tuple<std::vector<Ts>...> vectors;
template <std::size_t... Is>
void push_back_impl(std::tuple<Ts...> values, std::index_sequence<Is...>) {
// Some kind of pack expansion here
// This doesn't work, but is kinda what I want
//std::get<Is>(vectors).push_back(std::get<Is>(values))...;
}
void push_back(std::tuple<Ts...> values) {
push_back_impl(values, std::index_sequence_for<Ts...>{});
}
};

如果我使用index_sequence不正确,也请纠正我。元编程让我有点头疼。

Pre-C++17,您可以使用eater:

template<class... Ts> void eater(Ts... ts) {}

那么功能可以是:

template <std::size_t... Is>
void push_back_impl(std::tuple<Ts...> values, std::index_sequence<Is...>) {
eater((std::get<Is>(vectors).push_back(std::get<Is>(values)), 0)...);
}

在C++17中,只需使用逗号运算符:

template <std::size_t... Is>
void push_back_impl(std::tuple<Ts...> values, std::index_sequence<Is...>) {
(std::get<Is>(vectors).push_back(std::get<Is>(values)),...);
}