- 作者: 雪山肥魚(yú)
- 時(shí)間:20220226 21:52
- 目的: remove_all_extents
remove_all_extents 是c++11 引入的類(lèi)模板。能力是把一個(gè)數(shù)組中的數(shù)組類(lèi)型部分移除掉,只保留元素類(lèi)型。
int a[12]; //a 的類(lèi)型為 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
//實(shí)現(xiàn)源碼
//泛化版本
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[] 無(wú)邊界數(shù)組
template<class T>
struct remove_all_extents<T[]> {
using type = typename remove_all_extents<T>::type;
};
無(wú)邊界數(shù)組:
a.cpp 中定義 int g_array[10] 全局?jǐn)?shù)組,其他cpp中想用,則需要 在b.cpp中 引用 extern int g_arry[ ]; 此時(shí)為 無(wú)邊界數(shù)組,即外界說(shuō)明。其中一個(gè)特化就是為這種情況準(zhǔn)備的。
能把多個(gè)[ ] 全部干掉的方式 是遞歸。元編程,多半會(huì)使用到遞歸。
分析:以c[2][8][9] 為例:
- 首先實(shí)例化出來(lái) 一個(gè) remove_all_extents<int[2][8][9]> 這樣一個(gè)類(lèi)出來(lái)。
- 進(jìn)入 第一個(gè)泛化版本。非類(lèi)型模板參數(shù) N 代表的是 2 ,實(shí)際上我認(rèn)為與 int(*a)[8][9] 有關(guān)呢。
- 緊接著,進(jìn)入 remove_all_exetend<int[8][9]>::type.
- 遞歸開(kāi)始。第二次 int[8][9]滿(mǎn)足的又是第一個(gè)特化版本,又把8 拿掉了,int[9]
- 繼續(xù)遞歸,滿(mǎn)足第一個(gè)特化,又把9 拿掉,編程了 remove_all_extent<int>
- 繼續(xù)遞歸,已經(jīng)沒(méi)有[],滿(mǎn)足的就是泛化版本。遞歸結(jié)束。
中間過(guò)程,一共實(shí)例化出來(lái) 多少 remove_all_extents 開(kāi)頭的類(lèi)呢,
四個(gè):
- remove_all_extents<int[2][8][9]>
- remove_all_extents<int[8][9]>
- remove_all_extents<int[9]>
- remove_all_extents<int>
最后的到的是type,再一層一層往回退。