理解「陣列的大小」範本函數
此程式碼使用範本函數來決定陣列的長度,但其內部運作原理可能是神秘的。讓我們深入研究一下它是如何完成這個任務的。
參數揭秘
函數參數 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(&)[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& 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!
以上是C 模板函數如何決定陣列的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!