- 作者: 雪山肥鱼
- 时间: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;
}
//实现源码
//泛化版本
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] 为例:
- 首先实例化出来 一个 remove_all_extents<int[2][8][9]> 这样一个类出来。
- 进入 第一个泛化版本。非类型模板参数 N 代表的是 2 ,实际上我认为与 int(*a)[8][9] 有关呢。
- 紧接着,进入 remove_all_exetend<int[8][9]>::type.
- 递归开始。第二次 int[8][9]满足的又是第一个特化版本,又把8 拿掉了,int[9]
- 继续递归,满足第一个特化,又把9 拿掉,编程了 remove_all_extent<int>
- 继续递归,已经没有[],满足的就是泛化版本。递归结束。
中间过程,一共实例化出来 多少 remove_all_extents 开头的类呢,
四个:
- remove_all_extents<int[2][8][9]>
- remove_all_extents<int[8][9]>
- remove_all_extents<int[9]>
- remove_all_extents<int>
最后的到的是type,再一层一层往回退。