Ваш вопрос было довольно сложно понять, но я сделаю все возможное ...
template <typename ... Args>
constexpr auto make_array(Args && ... pArgs)
{
using type = std::common_type_t<std::decay_t<Args>...>;
return std::array<type, sizeof...(Args)>{ (type)pArgs ... };
}
Тогда используйте это так:
auto constexpr var_array_of_arrays = std::make_tuple
(
make_array(1, 2, 3, 3),
make_array(2, 3, 4),
make_array(1, 2, 3 ,4 ,3, 5)
);
Чтобы получить M-й элемент, к которому вы обращаетесь, он должен быть константой времени компиляции:
std::get<M>(var_array_of_arrays);
Чтобы получить доступ к N-му элементу в массиве Mth:
auto constexpr value = std::get<M>(var_array_of_arrays)[N]
Для улучшения интерфейса:
template <size_t M, size_t N, typename T >
constexpr decltype(auto) get_element(T && pInput)
{
return std::get<M>(std::forward<T>(pInput))[N];
}
Используется так:
auto constexpr element0_1 = get_element<0, 1>(var_array_of_arrays);
Это позволит вам использовать массив массивов переменной длины или, по крайней мере, что-то, что ведет себя так же и идентично тому, что в памяти.
Полный пример здесь:
Онлайн-компилятор