reremove_all_extents

  • 作者: 雪山肥魚(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] 為例:

  1. 首先實(shí)例化出來(lái) 一個(gè) remove_all_extents<int[2][8][9]> 這樣一個(gè)類(lèi)出來(lái)。
  2. 進(jìn)入 第一個(gè)泛化版本。非類(lèi)型模板參數(shù) N 代表的是 2 ,實(shí)際上我認(rèn)為與 int(*a)[8][9] 有關(guān)呢。
  3. 緊接著,進(jìn)入 remove_all_exetend<int[8][9]>::type.
  4. 遞歸開(kāi)始。第二次 int[8][9]滿(mǎn)足的又是第一個(gè)特化版本,又把8 拿掉了,int[9]
  5. 繼續(xù)遞歸,滿(mǎn)足第一個(gè)特化,又把9 拿掉,編程了 remove_all_extent<int>
  6. 繼續(xù)遞歸,已經(jīng)沒(méi)有[],滿(mǎn)足的就是泛化版本。遞歸結(jié)束。

中間過(guò)程,一共實(shí)例化出來(lái) 多少 remove_all_extents 開(kāi)頭的類(lèi)呢,
四個(gè):

  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,再一層一層往回退。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容