首頁 >後端開發 >C++ >C 模板函數如何決定陣列的大小?

C 模板函數如何決定陣列的大小?

DDD
DDD原創
2024-12-05 17:31:11664瀏覽

How Does a C   Template Function Determine the Size of an Array?

理解「陣列的大小」範本函數

此程式碼使用範本函數來決定陣列的長度,但其內部運作原理可能是神秘的。讓我們深入研究一下它是如何完成這個任務的。

參數揭秘

函數參數 T(&)[size] 最初可能看起來令人困惑。從內到外解碼它會顯示大小為 size 且類型為 T 的未命名數組的引用。這意味著它接受對任何數組的引用,其中數組的類型和大小由模板參數指定。

動作中的模板推導

當使用陣列呼叫函數時,例如as:

int a[10];
GetArrLength(a);

編譯器嘗試推斷模板參數。若要符合參數類型,T 必須為 int,大小必須為 10(導致參數引用 10 個整數的陣列)。然後函數傳回大小,提供數組中的元素數量。

解決潛在問題

此程式碼有兩個潛在問題。首先,大小不能為負,因此有符號類型不應用於模板參數或傳回類型。相反,應該使用無符號類型,例如 std::size_t:

template<typename T, std::size_t Size>
std::size_t GetArrLength(T(&amp;)[Size]) { return size; }

其次,儘管數組大小具有常數性質,但函數的結果不是常數表達式。為了增強可用性,首選常數表達式:

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&amp; sizeof_array_helper(T(&amp;)[Size]);

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

使用此技術,您可以將陣列的大小作為常數表達式檢索:

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

以上是C 模板函數如何決定陣列的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn