C++ 可变多维数组

C++ 可变多维数组,c++,templates,multidimensional-array,variadic-templates,C++,Templates,Multidimensional Array,Variadic Templates,我可以像这样调用多维数组吗 func(0,0,0); //=> if I know it's dimension on the run time. func(0,0,0,0,0,0,0,0,0,0,0); //=> if I know it's dimension on the run time. 通过变量模板的帮助 而不是: data[0][0][0]; data[0][0][0][0][0][0][0][0][0][0][0]; 可以重载运算符()。我不确定这是否会对你有

我可以像这样调用多维数组吗

func(0,0,0); //=> if I know it's dimension on the run time. 
func(0,0,0,0,0,0,0,0,0,0,0); //=> if I know it's dimension on the run time. 
通过变量模板的帮助

而不是:

data[0][0][0];
data[0][0][0][0][0][0][0][0][0][0][0];
可以重载运算符()。我不确定这是否会对你有很大帮助

如果您使用的是C++11,您可能会创造性地考虑使用初始值设定项列表。

您可以重载运算符()。我不确定这是否会对你有很大帮助


如果您使用的是C++11,您可能会创造性地考虑使用初始值设定项列表。

这应该可行,但您必须使用
索引(数据,1,2,3)

它适用于
普通数组
以及
std::数组
。您可以通过复制专门化来扩展它。(我认为它应该适用于重载运算符[]但不确定的任何事情。)





我没有将
auto
用于
尾部返回类型
,因为索引的
变量版本在推断返回类型时将不匹配。因此,在使用
gcc
解决这一问题之前,您必须使用类似的方法。

这应该是可行的,但您必须使用
索引(数据,1,2,3)

它适用于
普通数组
以及
std::数组
。您可以通过复制专门化来扩展它。(我认为它应该适用于重载运算符[]但不确定的任何事情。)





我没有将
auto
用于
尾部返回类型
,因为索引的
变量版本在推断返回类型时将不匹配。因此,在使用
gcc
解决这个问题之前,您必须使用类似的方法。

您想创建一个数组,或者从中获取一个元素吗?更多详细信息或用例将非常有用。不太清楚你为什么要这么做。你想创建一个数组,或者从中获取一个元素?更多的细节或者用例会很有帮助。我不太清楚你为什么要这么做。非常感谢你,这是一个很好的解决方案。@Avatar很高兴它能帮上忙。事实上,我甚至可以自己用。在生成的代码中始终执行[]比执行[]容易。所以也谢谢你提出这个想法:)非常感谢你,很好的解决方案。@Avatar很高兴它有帮助。事实上,我甚至可以自己用。在生成的代码中始终执行[]比执行[]容易。所以也谢谢你提出这个想法:)
#include <iostream>
#include <array>

template<typename T, size_t dim>
struct getTypeAtDim { typedef T type; };

template<typename T, size_t N>
struct getTypeAtDim<T[N],1> { typedef T type; };

template<typename T, size_t dim, size_t N>
struct getTypeAtDim<T[N],dim> : getTypeAtDim< T, dim-1> {};

template<typename T, size_t N>
struct getTypeAtDim<std::array<T,N>,1> { typedef T type; };

template<typename T, size_t dim, size_t N>
struct getTypeAtDim<std::array<T,N>,dim> : getTypeAtDim< T, dim-1> {};

template<typename T, size_t dim>
using typeAtDim = typename getTypeAtDim<T, dim>::type;

template<typename T> 
typeAtDim<T,1>&
indexed(T& arr, const int& first) {
    return arr[first];
}

template<typename T, typename... Args> 
typeAtDim<T,sizeof...(Args) + 1>& 
indexed(T& arr, const int& first, const Args& ...rest) {
    return indexed(arr[first],rest...);
}
int main() {
    std::array<int,2> a1 = {1,2};
    std::array<int,2> a2 = {3,4};
    std::array<std::array<int,2>,2> a = {a1,a2};
    std::array<std::array<std::array<int,2>,2>,2> c = {a,a};
    int b[2][2] = {{5,6},{7,8}};


    std::cout << indexed(a,1,1) << std::endl;
    indexed(a,1,1) = 5;
    std::cout << indexed(a,1,1) << std::endl;
    std::cout << indexed(b,1,1) << std::endl;
    std::cout << indexed(c,1,1,1) << std::endl;
    indexed(c,1,1) = a1;
    std::cout << indexed(c,1,1,1) << std::endl;
}
4 5 8 4 2