此代码定义了一个模板函数 GetArrLength,旨在确定数组的大小:
template<typename T, int size> int GetArrLength(T(&)[size]){return size;}
参数T(&)[size] 被声明为对 T 类型大小为 size 的数组的引用。这意味着它接受对类型和大小指定为模板参数的任何数组的引用。
调用此函数时,编译器会尝试推导模板参数。例如,如果我们这样调用:
int a[10]; GetArrLength(a);
编译器将确定 T 为 int,大小为 10,创建一个对 10 个整数数组的参数引用。
函数返回模板参数size的值,有效提供了模板中元素的数量array.
此代码简化了数组大小的获取,但有一些缺点。首先,它对模板参数和返回值都使用有符号类型,这是有问题的,因为大小不能为负数。为了获得更稳健的解决方案,应使用无符号类型,例如 std::size_t。
其次,此函数的结果不是常量表达式,即使数组大小应该是。常量表达式求值对于某些优化至关重要。
提供常量表达式结果的更高级方法涉及使用类型自省和 sizeof 运算符:
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))
该技术利用了字符数组的大小等于其元素计数的事实。 sizeof 运算符检索用于表示模板参数大小的 char 数组的大小,提供数组大小的常量表达式评估。
以上是如何在编译时有效确定 C 数组的大小?的详细内容。更多信息请关注PHP中文网其他相关文章!