"iterating" 在 std::tuple 上并且可以访问所有构造函数
"iterating" over a std::tuple and having access to all the constructors
我是可变参数模板的新手,我很难实现这个容器 class。我想要的是获取类型列表,然后创建一个包含每种类型的 std::vectors
的 std::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);
}
};
我是可变参数模板的新手,我很难实现这个容器 class。我想要的是获取类型列表,然后创建一个包含每种类型的 std::vectors
的 std::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);
}
};