"iterating" 在 std::tuple 上并且可以访问所有构造函数

"iterating" over a std::tuple and having access to all the constructors

我是可变参数模板的新手,我很难实现这个容器 class。我想要的是获取类型列表,然后创建一个包含每种类型的 std::vectorsstd::tuple。我遇到的具体困难是 "iterating" 这个 std::tuple

我正在阅读 this answer,它提到您可以为此使用 std::apply。我不确定我是否理解 "fold expression." 的目的这是我尝试过的:

#include <iostream>
#include <tuple>
#include <vector>

template<typename... Types>
class VecCollection {
public:
    std::tuple<std::vector<Types>...> m_stuff; // inside or outside?
    VecCollection(unsigned vec_length, Types... things) 
        : m_stuff(std::make_tuple(std::vector<Types>(things)...)) 
    {
        std::apply(
            [](auto&&... vecs) { 
                for(int i = 0; i < 3; ++i) {
                    vecs.push_back(Types()...);
                }
            }, 
            m_stuff);
    }
};



int main() {
    VecCollection<int, float>(3, 2.6, 400);
    return 0;
}

如果我删除构造函数中的 apply 调用,它会编译。我认为问题是Types()...。我是否可以以一般方式访问每个构造函数?

如果我回到 运行 时代的多态性并为所有这些 Types 保留一堆指向基 class 的指针,会不会更容易?

试试这个。

template<typename... Types>
class VecCollection {
public:
    std::tuple<std::vector<Types>...> m_stuff; // inside or outside?

    VecCollection(unsigned vec_length, Types... things)
        : m_stuff(std::make_tuple(std::vector<Types>(things)...))
    {
        std::apply(
            [](auto&&... vecs) {
                for(int i = 0; i < 3; ++i) {
                    ((vecs.push_back(Types()), ...));
                }
            },
            m_stuff);
    }
};