Я новичок в шаблонах variadi c, и мне трудно реализовать этот контейнерный класс. Я хочу взять список типов, а затем создать std::tuple
, который содержит std::vectors
каждого типа. Специфическая c сложность, с которой я столкнулся, заключается в «итерации» по этому 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
?