获取数组大小的几种方式

最近研究了下某某源码,发现一些 “别出心裁” 的用法,茶思饭后来总结梳理下。

 

看到一种获取数组的大小,方式有点特殊,代码类似下面这种形式:

template<typename T, size_t N>
inline size_t ArraySize(const T (&arr)[N])
{
  return N;
}

有的小伙伴会问,这里编译器为什么可以推导出数组 N 的值?

其实很好理解,参数arr是引用,定义的时候大小是已知的,编译器在上下文调用中能推导出来。

如果参数改为 T arr[N],编译器理解为T* arr(数组作为函数参数,传递的是数组的起始地址),而 N 则被忽略,数组大小是未知的。

 

顺便总结下获取数组大小的几种方式:
1.通过sizeof获取

  int arr[4];

  int arrSize = sizeof(arr) / sizeof(arr[0]);

2.标准C++模板库

  int arr[4];

  int arrSize = std::extent<decltype( arr ), 0>::value;

3.函数模板参数自动推导

  template<typename T, size_t N>
  inline size_t ArraySize(const T (&arr)[N])
  {
  return N;
  }

4.boost库函数size()

  int arr[4];   

  int arrSize = boost::size(arr);

 

作者:博客园博主 KeepHopes,对大数据、人工智能领域颇感兴趣,请多多赐教!
原文链接:https://www.cnblogs.com/yuwanxian/p/14059506.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。转载请注明出处,谢谢!
posted @ 2022-05-26 14:17  ywx-super  阅读(192)  评论(0编辑  收藏  举报