通过未知数量的尺寸循环

Loop through unknown number of dimensions

本文关键字:循环 未知数      更新时间:2023-10-16

我想编写一个循环,可以给我一个数组的尺寸。我想使其适用于任何数组,并且应该返回尺寸的尺寸。

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]之后添加CC_2。最后一次迭代将失败,这应该停止while-loop。

我如何"连接 评估"数组名称?

我也很高兴在什么测试检查"这将失败?"或"还有另一个维度?"的帮助下的帮助。在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;
}