c++ - 循环遍历未知数量的维度
问题描述
我想写一个循环,它可以给我一个数组的维度。我想让它可用于任何数组,它应该返回维度的大小。
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
(并且最后一条语句失败)。
所以模式看起来很清楚“每次迭代都在 .[0]
之后添加arr
。最后一次迭代将失败,这应该停止 while 循环。
如何“连接+评估”数组名称?
我也会感谢有关哪些测试检查“这会失败吗?”或“是否有另一个维度?”的帮助。在 C++ 中,因为我只是在学习它。
解决方案
如果您使用的是 c++ 17 编译器,则可以使用类型特征结构std::rank
,std::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;
}
推荐阅读
- angular - 我的 Angular 8 应用程序在 IE 浏览器中显示空白页面
- r - 没有名为“外国”的包裹
- sql - T-SQL - 获取每个 ID 的最后 30 行
- react-native - React Native Bottom Tab Navigator - 图标不显示
- oracle - 加载 csv 并写入带有个别错误的不良记录
- html - 在自身上添加背景图像?
- android - 在设置中进行选择时播放声音(Android 应用程序)
- android - Flutter由于源代码错误无法编译
- java - Intellij IDEA 在调试时获取远程日志
- node.js - 在对象中传递表单数据 | 爱讯