代码之家  ›  专栏  ›  技术社区  ›  Hope

循环通过未知数量的维度

  •  0
  • Hope  · 技术社区  · 7 年前

    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

    如何“连接+计算”数组名称?

    我也会很感激帮助什么测试检查“这会失败吗?”,或“是否有其他维度?”在C++中,我只是学习它。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Nishant Singh    7 年前

    如果使用的是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;
    }
    

    #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;
    }