Возможно ли объявить (на ходу) вектор заданной размерности?
Допустим программа, во время ее исполнения, получает некоторое числовое значение N, по которому следует "построить" вектор N размерности (то бишь ::std::vector<::std::vector<...::std::vector<T>...>). Можно ли как-то это реализовать и, если возможно, то как? Может если для данного примера с vector это никак не сделать, то с помощью чего можно реализовать такую идею?
Я предполагаю, должно быть что-то в духе:
template<int Size, typename T>
decltype(auto) outType()
{
if (Size <= 0) return ::std::vector<T>();
return outType<Size - 1, ::std::vector<T>>();
}
Ответы (2 шт):
если N - константа, известная во время компиляции, то такую вещь провернуть еще можно было бы,
но во время выполнения, когда программа уже скомпилирована, многомерный вектор придется создавать руками, т.е. рекурсивным вызовом
да и по хорошему вместо многомерного вектора всегда можно создать одномерный вектор, только индекс придется вычислять самому (например вместо двумерного вектора зачастую удобнее иметь одномерный размером MxN, где index = i + j * M)
Для ограниченного набора случаев подобную задачу можно решить перебором всех случаев в рантайме, примерно так:
switch(dim)
{
case 1: process<1>(...);
case 2: process<2>(...);
...
Копипасту можно убрать шаблонным и/или препроцессорным метапрограмммированием.
В общем случае, нельзя воплотить неограниченное (или слишком большое) число вариантов шаблона