我是可变参数模板的新手,在实现此容器类时遇到了困难。我想要的是获取类型列表,然后创建一个包含每种类型的std::tuple
的std::vectors
。我遇到的具体困难是对此std::tuple
进行“迭代”。
我正在阅读this answer,它提到您可以为此使用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
保留一堆指向基类的指针,会容易吗?
尝试一下。
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);
}
};