"итерация" по 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);
    }
};
Другие вопросы по тегам