亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

有人能解釋給我數組大小的模板代碼嗎?

有人能解釋給我數組大小的模板代碼嗎?

C++
白板的微信 2019-07-03 15:59:41
有人能解釋給我數組大小的模板代碼嗎?template<typename T, size_t n>size_t array_size(const T (&)[n]){     return n;}我沒有得到的部分是這個模板函數的參數。當我將數組傳遞給n數組中元素的數量?
查看完整描述

3 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

首先,您必須理解,嘗試從數組中獲取值可以為您提供指向其第一個元素的指針:

int a[] = {1, 2, 3};int *ap = a; // a pointer, size is lostint (&ar)[3] = a; // a reference to the array, size is not lost

引用是指使用對象的確切類型或基類類型的對象。關鍵是模板通過引用接收數組。數組(而不是對它們的引用)作為參數在C+中不存在。如果您給一個參數一個數組類型,它將是一個指針。因此,當我們想知道傳遞數組的大小時,使用引用是必要的。大小和元素類型是自動推導出來的,就像函數模板的一般情況一樣。以下模板

template<typename T, size_t n>size_t array_size(const T (&)[n]) {
    return n;}

使用我們先前定義的數組調用a將隱式實例化以下函數:

size_t array_size(const int (&)[3]) {
    return 3;}

可以這樣使用:

size_t size_of_a = array_size(a);

一段時間前我編造了一個變體編輯:原來有人已經有了同樣的想法這里]它可以在編譯時確定一個值。它沒有直接返回值,而是根據n:

template<typename T, size_t n>char (& array_size(const T (&)[n]) )[n];

你說如果數組n元素時,返回類型是對具有大小的數組的引用。n元素類型char..現在,您可以獲得已傳遞數組的編譯時確定的大?。?/trans>

size_t size_of_a = sizeof(array_size(a));

因為一個數組charn元素有相當大的n,這也會給出給定數組中元素的數量。在編譯時,所以您可以

int havingSameSize[sizeof(array_size(a))];

因為函數從來沒有被真正調用過,所以它不需要被定義,所以它沒有一個身體。希望我能把這件事弄清楚一點。


查看完整回答
反對 回復 2019-07-03
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

可以這樣想,假設您有一堆函數:

// Note that you don't need to name the array, since you don't// actually reference the parameter at all.size_t array_size(const int (&)[1]){
    return 1;}size_t array_size(const int (&)[2]){
    return 2;}size_t array_size(const int (&)[3]){
    return 3;}// etc...

現在,當您調用這個函數時,哪個函數會被調用?

int a[2];array_size(a);

現在,如果您將數組大小臨時化,您將得到:

template <int n>size_t array_size(const int (&)[n]){
    return n;}

編譯器將嘗試實例化與調用它的任何參數匹配的數組_size版本。因此,如果您用一個10 int的數組調用它,它將用n=10實例化arraysize。

接下來,只需將類型臨時化,這樣您就可以使用多個int數組來調用它了:

template <typename T, int n>size_t array_size(const T (&)[n]){
    return n;}

你就完蛋了。

編輯*關于(&)

控件周圍需要括號。&若要區分int引用數組(非法)和INT數組(您想要什么),請執行以下操作。因為.的優先[]高于&,如果你有以下聲明:

const int &a[1];

由于運算符優先,您將得到一個對int的const引用的單元素數組。如果你想&首先,您需要強制使用括號:

const int (&a)[1];

現在,您有一個對一個元素數組的INT的Const引用。在函數參數列表中,如果不使用參數,則不需要指定參數的名稱,因此可以刪除名稱,但保留括號:

size_t array_size(const int (&)[1])


查看完整回答
反對 回復 2019-07-03
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

數組沒有發生任何變化。它是一個未使用的參數,用于解析模板函數的簽名。

它也不能用作模板參數,但這是一個單獨的nit。


查看完整回答
反對 回復 2019-07-03
  • 3 回答
  • 0 關注
  • 459 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號