C++ Как создать вариативное количество массивов, размеры которых передаются через вариативный template?

Как создать такой класс test с вариативным template, что в template передаются числа, сколько чисел столько внутри класса создается массивов? Эти числа означают размеры массивов. С помощью метода getArray можно получать доступ к одному из этих массивов.

Далее представлен пример кода, в котором отображено как создать экземпляр требуемого класса и как им должно быть можно манипулировать.

test<5,8,10,15>t;

for(int i=0;i<5;i++)
cout<<t.getArray(0)[i];

for(int i=0;i<8;i++)
cout<<t.getArray(1)[i];

for(int i=0;i<10;i++)
cout<<t.getArray(2)[i];

for(int i=0;i<15;i++)
cout<<t.getArray(3)[i];

Ответы (2 шт):

Автор решения: maestro

Передавать номер массива в качестве параметра функции не получится, так как он должен быть известен на этапе компиляции. Здесь пример на кортеже, где номер массива передаётся как параметр шаблона.

template<size_t... sizes>
class test
{
public:
    template<size_t arrNum>
    auto get(){
        return std::get<arrNum>(t);
    }

private:
    std::tuple<std::array<int, sizes>...> t;
};


test<5,8,10,15>t;

for(int i=0;i<5;i++)
    cout<<t.get<0>()[i];

for(int i=0;i<8;i++)
    cout<<t.get<1>()[i];

for(int i=0;i<10;i++)
    cout<<t.get<2>()[i];

for(int i=0;i<15;i++)
    cout<<t.get<3>()[i];
→ Ссылка
Автор решения: Chorkov
template< size_t ... sizes >
class test
{
    std::vector< std::vector< int > > data = { 
        std::vector< int >( sizes, 0 ) ...  
    };
public:
    std::vector< int >& getArray (size_t i) { return data.at(i); }
    const std::vector< int >& getArray (size_t i) const { return data.at(i); }
    size_t size() { return data.size(); }
};
→ Ссылка