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