如何用推导的数组大小解释 C++ 模板

问题描述 投票:0回答:1

我编写了一个模板,可以正确推导方阵的大小。我通过寻找在线解决方案得到了这个,但不确定我是否理解模板的内部工作原理。模板函数的目的是比较两个相同大小的方阵以验证它们几乎相等。

template<typename T, int N>
void
CompareRMatrixResults(T (&R)[N], creal_T M[4][4])

对于第一个参数,我传入 2x2 或 4x4 方阵。对于第二个参数,我传入一个 4x4 矩阵,其元素类型为

creal_T
。 (由于数据的设置方式,如果 N = 2,则 M 在函数体内被视为 2x2 矩阵。

为什么(

&
)中需要
&R
?还有其他有效的签名吗?请解释如何解释
(&R)[N]
以及为什么我不需要
[N][N]
因为二维数组是方形的。 N是如何用这个模板推导出来的?

我通过搜索找到了许多链接,包括:

https://en.cppreference.com/w/cpp/language/class_template_argument_deduction

在c++中将多维数组转换为指针

https://www.codeproject.com/articles/295853/obtaining-the-size-of-a-cplusplus-array-using-te-2

但是,虽然我得到了进行二维数组推导的秘诀,但我不太清楚它是如何工作的。

multidimensional-array c++17 c++-templates
1个回答
0
投票

您还可以使用“T R[N][N]”或“T R[][N]”或“T (*R)[N]”(它们是等效的)。当传递给函数时,数组会衰减为指针。

关于“T (&R)[N]”:如果传递 int[2][4],编译器会将 T 推导为 int[4],将 N 推导为 2。在这种情况下,使用 & 数组将作为引用传递.

对于你的第二个论点,前 4 个论点没有任何实际意义。从编译器的角度来看,你也可以写“M[][4]”。当传递“creat_t M[2][4]”作为第二个参数时,您也不会出现编译错误。

© www.soinside.com 2019 - 2024. All rights reserved.