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

时间:2018-07-11 15:05:24

标签: c++ templates tuples variadic-templates

我有一个数组类结构

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,也请纠正我。元编程让我有点头疼。

1 个答案:

答案 0 :(得分:2)

C ++ 17之前的版本,您可以使用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)...);
}

然后该函数可以是:

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)),...);
}

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

{{1}}