c++ - 如何将值元组中的相应值附加到相同类型的 vector 元组?

标签 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 将值的元组推送到每种类型的每个对应 vector 上。我正在考虑用 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,也请纠正我。元编程让我有点头疼。

最佳答案

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

关于c++ - 如何将值元组中的相应值附加到相同类型的 vector 元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51288827/

相关文章:

c++ - 使用 boost spirit (qi) 解析帝国值

c++ - 基于 2D 纹理的体绘制

c++ - vector 指针,继承

系统组件的 C++ 依赖倒置

opencv - 确定数据类型并用作模板类型名

C++ 转换模板

Python:循环元组并将每个值插入到数据框中

Python:遍历并按元素比较 2 个元组列表

python - 将列表转换为二元组列表

c++ - 如何在 C++ 中正确返回模板化对象?