0

我是可变参数模板的新手,我很难实现这个容器类。我想要的是获取一个类型列表,然后创建一个std::tuple包含std::vectors每种类型的列表。我遇到的具体困难是对此进行“迭代” std::tuple

我正在阅读这个答案,它提到你可以使用std::apply它。我不确定我是否理解“折叠表达式”的目的。这是我尝试过的:

#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吗?

4

1 回答 1

1

试试这个。

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);
    }
};
于 2020-01-25T22:01:15.413 回答