Как (если возможно) я могу использовать вариативное программирование С++ 11 для определения серии vector
в теле функции (или, другими словами, последовательности N
-мерных массивов с уменьшением N
до 0), как переменные ниже?
vector<vector<vector<int>>> v<3>;
vector<vector<int>> v<2>;
vector<int> v<1>;
int v<0>;
Я представлял себе что-то вроде:
#include <iostream>
#include <vector>
using namespace std;
template<int ...> struct seq {};
template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};
template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };
template<int ...S>
void f(seq<S...>) {
//how do I write definitions of v<N> here?
vector<vector<...(N layers)<vector<int> ...> v<N>; //??how-to, not valid c++
vector<vector<...(N -1 layers)<vector<int> ...> v<N-1>;//??how-to, not valid c++
//...
vector<int> v<1>; //??how-to, not valid c++
int v<0>; //??how-to, not valid c++
//...
}
int main() {
f(typename gens<3>);
return 0;
}
Кроме того, будет ли это проще в С++ 14?
Спасибо,
--РЕДАКТИРОВАТЬ--
Просто чтобы уточнить, что я подразумеваю под «башней векторов», лучше всего описывает N-кортеж (v_1, v_2,..., v_N), где N — целочисленный параметр шаблона. v_1 — вектор, v_2 — вектор> и так далее.
--EDIT2--
На данный момент ответы quantdev и R успешно решили проблему определения N-кортежа для любого фиксированного N, например 3, но не могут создать кортеж для неопределенного N
. В дополнение к функциональности в ответах мне нужна функция, которую можно использовать как gen_tower<N>
, которая возвращает tuple(v1,v2,...,vN)
.
Рассмотрим пример использования вариативного программирования для вычисления факториалов. Мне нужна функция для вычисления факториала factorial<N>()
для любого N
, в дополнение к возможности выписывать любое конкретное выражение <1*2*3>
вручную. (Вот почему я спросил о вариативном программировании и о том, упростит ли его c++14
.)
P.S.
Исключительно из личных интересов я хочу, чтобы эта последовательность реализовывала универсальную функцию, которая может читать N-мерный массив из файла. Я пока точно не знаю, как это сделать, но думаю, что на первом этапе я смогу определить окончательный N
-мерный массив и промежуточные k
-мерные массивы для k
от N-1
до 1
. Я могу читать двумерные массивы и трехмерные. Но было бы неплохо иметь возможность читать массивы любой размерности.