美文网首页
reremove_all_extents

reremove_all_extents

作者: 404Not_Found | 来源:发表于2022-02-26 12:41 被阅读0次
    • 作者: 雪山肥鱼
    • 时间:20220226 21:52
    • 目的: remove_all_extents

    remove_all_extents 是c++11 引入的类模板。能力是把一个数组中的数组类型部分移除掉,只保留元素类型。

    int a[12]; //a 的类型为 int[12]
    

    remove_all_extents 去除掉 [12]

    #include <iostream>
    using namespace std;
    
    int main(int argc, char ** argv)
    {
        float a[12];
        int b[5][8]; //
        cout << typeid(decltype(b)).name() << endl;//int [5][8]
    
        int c[2][8][9];// int [2][8][9];
    
        cout << typeid(std::remove_all_extents<decltype(a)>::type).name() << endl;
        cout << typeid(std::remove_all_extents<decltype(b)>::type).name() << endl;
        cout << typeid(std::remove_all_extents<decltype(c)>::type).name() << endl;
    
    }
    
    图片.png
    //实现源码
    //泛化版本
    template <class T>
    struct remove_all_extents {
        using type = T;
    };
    
    template <class T, size_t N>
    struct remove_all_extents<T[N]> {
        using type = typename remove_all_extents<T>::type;
    };
    //T[] 无边界数组
    template<class T>
    struct remove_all_extents<T[]> {
        using type = typename remove_all_extents<T>::type;
    };
    

    无边界数组:
    a.cpp 中定义 int g_array[10] 全局数组,其他cpp中想用,则需要 在b.cpp中 引用 extern int g_arry[ ]; 此时为 无边界数组,即外界说明。其中一个特化就是为这种情况准备的。

    能把多个[ ] 全部干掉的方式 是递归。元编程,多半会使用到递归。
    分析:以c[2][8][9] 为例:

    1. 首先实例化出来 一个 remove_all_extents<int[2][8][9]> 这样一个类出来。
    2. 进入 第一个泛化版本。非类型模板参数 N 代表的是 2 ,实际上我认为与 int(*a)[8][9] 有关呢。
    3. 紧接着,进入 remove_all_exetend<int[8][9]>::type.
    4. 递归开始。第二次 int[8][9]满足的又是第一个特化版本,又把8 拿掉了,int[9]
    5. 继续递归,满足第一个特化,又把9 拿掉,编程了 remove_all_extent<int>
    6. 继续递归,已经没有[],满足的就是泛化版本。递归结束。

    中间过程,一共实例化出来 多少 remove_all_extents 开头的类呢,
    四个:

    1. remove_all_extents<int[2][8][9]>
    2. remove_all_extents<int[8][9]>
    3. remove_all_extents<int[9]>
    4. remove_all_extents<int>

    最后的到的是type,再一层一层往回退。

    相关文章

      网友评论

          本文标题:reremove_all_extents

          本文链接:https://www.haomeiwen.com/subject/isocrrtx.html