模板推导数组函数,获取数组长度

本文探讨了C++中的模板在处理数组和函数时的推导规则,强调了非引用类型推导为指针,引用类型推导为数组加长度的概念。介绍了C++11引入的Array类型来更好地处理数组长度信息。同时,文章通过案例分析了函数指针和引用的差异,并展示了如何在编译阶段获取数组长度。最后,提出了使用constexpr关键字进行编译时计算的优化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 数组和函数推导

    • 说明

      • 非引用类型,推导成指针。
      • 引用类型,推导成数组加长度。
    • 注意

      • 数组获取长度是有意义的,不过建议新型数组.
  2. 数组

    • 说明

      • 推导出来长度.
      • 数组和指针,是两个概念,虽然又通用。
      • 数组是长度固定的数组类型, 指针是可以为任意类型任意值的类型.
      • 内部也不方便计算.
    • 案例一

      template<typename T>
      void show(T& a) {
         // error code
         a.nice();
      }
      int main() {
         show("abcsd");
      }
      
      • const char [5]类型.
      • 这里是引用.
    • 案例二

      template<typename T>
      void show(T a) {
         // error code
         a.nice();
      }
      int main() {
         show("abcsd");
      }
      
      • const char*普通类型.值传递的规则.
    • 小结

      • 上面是同样的参数但是不同的类型.
      • 因为无法声明为任意长度数组类型,可以用引用的方式获取具体类型.
    • 问题

      • 固定长度了,但是无法变长,变长了之后就又是指针才支持.
      • 后来C++11推出了一个新的STL,即Array类型.
    • 案例三获取数组长度

      template<typename T,int N>
      void show(T (&a)[N]) {
         // error code
         a.nice();
      }
      int main() {
         show("abcsd");
      }
      
      • T是基本类型,&a表示引用的方式,N表示数组长度。
      • 多一个类型多一份代码.
      • 所以建议用array而不是这种。
    • 长度信息

      • 长度信息是可以在程序编译阶段就可以知道的.
      • 所以可以用下面的机制获取长度.
      template<typename T,int N>
      int show(T (&a)[N]) {
         // error code
         a.nice();
      }
      int main() {
         show("abcsd");
      }
      
    • 改良

      • 用于数组.
      template<typename T,int N>
      constexpr int show(T (&a)[N]) {
         return N;
      }
      int main() {
         char s[show("abcsd")];
      }
      
      • const是需要直接复制的.
      • constexpr可以在编译阶段简单计算.
  3. 函数

    • 说明

      • 函数指针和函数引用没有太大的差别.
    • 简单案例

      template<typename T>
      void show(T&a) {
         // error code
         a.error();
      }
      int main() {
         show(main);
      }
      
      • 引用传递.
      • T = int (void),函数类型,不能修改.
    • 值传递

      template<typename T>
      void show(T a) {
         // error code
         a.error();
      }
      int main() {
         show(main);
      }
      
      • T=int (__cdecl *)(void)
      • 即指针类型.
  4. 总结

    • 可以用模板在编译阶段获取数组类型和对应长度.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值