"перебирая" через std :: tuple и имея доступ ко всем конструкторам - PullRequest
0 голосов
/ 26 января 2020

Я новичок в шаблонах 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?

1 Ответ

1 голос
/ 26 января 2020

попробуйте это.

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);
    }
};
...