c++ - 遍历未知数量的维度

标签 c++ arrays multidimensional-array

我想写一个循环,它可以给我一个数组的维数。我想让它可用于任何数组,它应该返回维度的大小。

int arr[3][5][10][9] ;
cout << "dimension 1: " << sizeof(arr)/sizeof(arr[0]) << endl; 
cout << "dimension 2: " << sizeof(arr[0])/sizeof(arr[0][0]) << endl; 
cout << "dimension 3: " << sizeof(arr[0][0])/sizeof(arr[0][0][0]) << endl;
cout << "dimension 4: " << sizeof(arr[0][0][0])/sizeof(arr[0][0][0][0]) << endl;
cout << "dimension 5: " << sizeof(arr[0][0][0][0])/sizeof(arr[0][0][0][0][0]) << endl;

这应该返回 3,5,10,9(最后一条语句失败)。

所以模式看起来很清楚“每次迭代都在 arr 之后添加 [0]。最后一次迭代将失败,这应该会停止 while 循环。

如何“连接+评估”数组名称?

如果您能帮助我检查“这会失败吗?”或“是否还有其他维度?”,我将不胜感激。在 C++ 中,因为我只是在学习它。

最佳答案

如果您使用的是 c++ 17 编译器,则可以使用类型特征结构 std::rankstd::extent 如下

#include <iostream>
#include <type_traits>

template<typename T>
void print_dimension(std::size_t i) {
    if (std::rank_v<T> > 0) {
        std::cout << "Dimension " << i << ":" << std::extent_v<T> << std::endl;
        print_dimension<typename std::remove_extent_t<T>>(i + 1);
    }
}

int main() {
int arr[3][5][10][9] ;
print_dimension<decltype(arr)>(1);
return 0;
}

如果您使用的是 C++ 11/14 编译器,则需要稍作修改

#include <iostream>
#include <type_traits>

template<typename T>
void print_dimension(std::size_t i) {
    if (std::rank<T>::value > 0) {
        std::cout << "Dimension " << i << ":" << std::extent<T>::value << std::endl;
        print_dimension<typename std::remove_extent<T>::type>(i + 1);
    }
}

int main() {
int arr[3][5][10][9] ;
print_dimension<decltype(arr)>(1);
return 0;
}

关于c++ - 遍历未知数量的维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55135436/

相关文章:

c++ - 字符串到 bool 表达式不起作用 C++

arrays - symmetricDifference 的通用数组扩展

c语言+二维数组

c++ - 如何为 MyClass** 传递 MyClass[][]?

c++ - 用 C++ 在桌面上叠加图像

c++ - 如何使用 'clang-win' 工具集构建调试 boost 静态库?

linux - Python/C++ 扩展。导入时,出现 undefined symbol 错误

javascript - 添加数组?

arrays - 从 MongoDb 中的数组的数组中删除元素

python - 等效于 Python 中的 R 数组