第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

此“數(shù)組大小”模板功能如何工作?

此“數(shù)組大小”模板功能如何工作?

C++
三國紛爭 2019-12-13 11:10:59
有人可以解釋此代碼的工作原理嗎?我知道這段代碼的目的是獲取數(shù)組的長度,但是我不知道這段代碼是如何工作的:template<typename T, int size>int GetArrLength(T(&)[size]){return size;}謝謝。
查看完整描述

3 回答

?
Smart貓小萌

TA貢獻1911條經(jīng)驗 獲得超7個贊

首先讓我們剖析參數(shù)T(&)[size]。首先從內(nèi)到外,從右到左,從括號組中讀取聲明:這是一個未命名的參數(shù),是size對type類型的數(shù)組的引用T。


也就是說,它接受對任何數(shù)組的引用,其中數(shù)組的類型和大小是模板參數(shù)。


如果我們這樣稱呼它:


int a[10];

GetArrLength(a);

編譯器將嘗試推斷模板參數(shù)。為了使參數(shù)類型與您要傳遞的參數(shù)相匹配,T必須為int并且size必須為10(使參數(shù)成為對10 ints 數(shù)組的引用)。


然后,您返回該大小,從而獲得數(shù)組中元素的數(shù)量。


此代碼有兩個“問題”。首先,大小不能為負,因此使用帶符號類型作為模板參數(shù)和返回類型沒有意義。而是應(yīng)使用無符號類型。最好是std::size_t:


template<typename T, std::size_t Size>

std::size_t GetArrLength(T(&)[Size]) { return size; }

第二個問題是,即使數(shù)組的大小是多少,此函數(shù)的結(jié)果也不是常量表達式。雖然在大多數(shù)情況下都可以,但是如果我們可以從中獲得一個常量表達式,那就更好了。那就是您得到此解決方案的地方:


template <std::size_t N>

struct type_of_size

{

    typedef char type[N];

};


template <typename T, std::size_t Size>

typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]);


#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))

這樣使用:


int a[10];

const std::size_t n = sizeof_array(a); // constant-expression!

它通過三件事起作用:第一是與上面相同的想法,模板參數(shù)將被填充以提供數(shù)組的大小。


第二部分是使用該信息來創(chuàng)建具有特定大小的類型,從而成為一個type_of_size輔助對象。該部分不是嚴格必需的,但我認為它使代碼更易于閱讀。A char[N]的大小N始終等于,因此我們可以濫用它來“存儲”數(shù)組的大小……以類型本身的大??!


第三部分是使用來獲得該大小sizeof。它實際上不評估任何東西,因此我們不需要為函數(shù)定義。它只是說:“如果要這樣做,大小將是……”。大小是char數(shù)組中“存儲”的大小。



查看完整回答
反對 回復(fù) 2019-12-14
?
大話西游666

TA貢獻1817條經(jīng)驗 獲得超14個贊

您可以犧牲可讀性來跳過最后一個版本中的樣板代碼,但是我將其寫為@Matthew Flaschen和@BobAlmond的練習(xí):) template <typename T, size_t size> char (&sizeof_array_helper( T (&)[size]))[size];-宏將保留原樣。


查看完整回答
反對 回復(fù) 2019-12-14
?
MM們

TA貢獻1886條經(jīng)驗 獲得超2個贊

使用C ++ 11時constexpr,“ return n;” 函數(shù)成為編譯時間常數(shù)!template <typename T, size_t n> constexpr size_t array_size(const T (&)[n]) { return n; }

查看完整回答
反對 回復(fù) 2019-12-14
  • 3 回答
  • 0 關(guān)注
  • 374 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號