【C++】定义返回数组指针的函数

server/2024/10/18 19:28:48/

【C++】定义返回数组指针的函数

  • 一. 朴素定义
  • 二. 使用类型别名
  • 三. 使用 auto 和尾置返回类型
  • 四. 使用 decltype

我们知道,不能直接将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值,因此,函数无法直接返回一个数组,不过,函数可以返回一个数组的指针或者引用。
【注】一些编译器支持数组的赋值,但最好避免使用非标准特性,以防止程序在其他编译器上无法正常工作。
这里给出四种方式,用于定义一个返回数组指针的函数,其中第三和第四种方式需要支持 C++11。

一. 朴素定义

朴素定义是我自己起的一个名字。。。就是指一个毫无技巧、粗暴地结合函数的定义和数组的定义的定义形式:

// 函数定义
ReturnT Func(parms) {// function body
}// 数组定义
ElemT arr[dim];// 返回数组指针
ElemT (*Func(parms))[dim] {// function body
}

这个定义看起来略微复杂且毫无美感,如果觉得上面的定义十分混乱难以理解,可以试着按照以下的步骤来阅读这个糟糕的定义:

  • Func(parms) 定义了一个函数;
  • (*Func(parms)) 表示可以对函数的结果进行解引用,请不要忘记最外面这一层括号,这是必须要有的!如果没有这对括号,函数的返回类型将是指针的数组!
  • (*Func(parms))[dim] 表示对函数的结果进行解引用,将会得到一个数组;
  • ElemT (*Func(parms))[dim] 表示数组中元素的类型是 ElemT
    上面的步骤看起来有点繁琐,也显得不够简洁。幸运的是,C++ 支持使用类型别名来简化上面的定义。

二. 使用类型别名

正如上面所说的,想要直接定义一个返回数组的指针或引用的函数相当繁琐,而使用类型别名恰好可以简化可以简化这一任务。类型别名可以视为某一类型的同义词,它可以让复杂的名字变得简单明了和易于使用。

typedef T ArrT[dim];
using ArrT T[dim];	// c++11
// func 返回一个指向含有 dim 个元素的数组的指针
// 数组中元素的类型为 T
ArrT *Func(parms) {// function body
}

从上面的定义中可以看到,使用类型别名确实可以让代码看起来干净简洁易于理解和使用。

三. 使用 auto 和尾置返回类型

C++11 引入了 auto 类型说明符,可以让编译器通过初始值来推算变量的类型。C++11 也支持尾置返回类型,用法是在形参列表后面用一个 “->” 后跟随一个类型,以此表示函数真正的返回类型跟在形参列表之后,而在前面本该放置函数返回类型的的地方放置一个 auto。

auto Func(parms) -> ReturnT {// function body
}

任何函数的定义都可以使用尾置返回类型,但是这种定义形式对于复杂返回类型最为有效。(内在基础类型和类类型也可以用,但是一般情况下没必要且意义不大)
使用 auto 和尾置返回类型来定义返回数组指针的函数是另一个不错的思路:

// 也请不要忘记这里的括号,这很重要!!
auto Func(parts) -> T(*)[dim] {// function body
}

四. 使用 decltype

C++11 引用了第二种类型说明符 decltype,用于选择并返回操作数的数据类型。

T tval;
decltype(tval) val;	// val 的数据类型是 T

因此,我们可以使用 decltype 来声明返回数组指针的函数,只要我们已经有了一个指向数组的指针对象。

T arr[dim];decltype(arr) *Func(parms) {// function body
}

需要注意的是,decltype 并不会把数组转换成对应的指针,因此 decltype 的结果是个数组,即 T[arr],但是我们需要的是一个指向数组的指针,因此在函数声明时要加一个 * 符号。


http://www.ppmy.cn/server/21097.html

相关文章

更易使用,OceanBase开发者工具 ODC 4.2.4 版本升级

亲爱的朋友们,大家好!我们的ODC(OceanBase Developer Center )再次迎来了重要的升级V 4.2.4,这次我们诚意满满,从五个方面为大家精心打造了一个更加易用、贴心,且功能更强的新版本,相…

LeetCode_链表的回文结构

✨✨所属专栏:LeetCode刷题专栏✨✨ ✨✨作者主页:嶔某✨✨ 题目描述: 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bo…

百种提权及手段一览系列第7集

特权升级的危险是显而易见的。通过提升权限,攻击者可以绕过网络安全措施,从而损害数据完整性、机密性和系统可用性。对于组织而言,这可能会导致数据泄露、系统停机以及潜在的法律和声誉后果。识别权限升级的迹象并部署预防性网络安全措施对于…

【ARMv9 DSU-120 系列 3 -- DSU-120 系统控制寄存器】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DSU-120 系统控制寄存器系统控制寄存器的访问方式Cluster 通用系统控制寄存器寄存器重置值Generic System Control registers summaryCluster Configuration RegisterDSU-120 系统控制寄存器 在ARMv9架构中,DSU-120(…

python绘制R控制图(Range Chart)

R控制图(Range Chart),也称为范围图或移动极差图,是一种用于分析和控制生产过程中的变异性的统计工具。它通常与Xbar控制图(均值图)一起使用,可以提供关于生产过程变异性的额外信息。以下是R控制…

【Vue3】watch监听使用【超详细】

文章目录 情况一:监听ref定义的基本类型数据情况二:监听ref定义的对象类型数据情况三:监听reactive定义的对象类型数据情况四:监听ref或reactive定义的对象类型数据中某个属性情况五:监听上述多个数据 #watch使用结构 watch(被监视的数据,监视的回调,配置对象(deep,immediate等…

使用 Python 和 DirectShow 从相机捕获图像

在 Python 中使用 OpenCV 是视觉应用程序原型的一个非常好的解决方案,它允许您快速起草和测试算法。处理从文件中读取的图像非常容易,如果要处理从相机捕获的图像,则不那么容易。OpenCV 提供了一些基本方法来访问链接到 PC 的相机(通过对象),但大多数时候,即使对于简单的…

[论文笔记]GAUSSIAN ERROR LINEAR UNITS (GELUS)

引言 今天来看一下GELU的原始论文。 作者提出了GELU(Gaussian Error Linear Unit,高斯误差线性单元)非线性激活函数: GELU x Φ ( x ) \text{GELU} x\Phi(x) GELUxΦ(x),其中 Φ ( x ) \Phi(x) Φ(x)​是标准高斯累积分布函数。与ReLU激活函数通过输入…