"итерация" по std::tuple и доступ ко всем конструкторам
Я новичок в вариативных шаблонах, и мне сложно реализовать этот контейнерный класс. Я хочу взять список типов, а затем создать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
?
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);
}
};