我编写了一个模板,可以正确推导方阵的大小。我通过寻找在线解决方案得到了这个,但不确定我是否理解模板的内部工作原理。模板函数的目的是比较两个相同大小的方阵以验证它们几乎相等。
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
https://www.codeproject.com/articles/295853/obtaining-the-size-of-a-cplusplus-array-using-te-2
但是,虽然我得到了进行二维数组推导的秘诀,但我不太清楚它是如何工作的。
您还可以使用“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]”作为第二个参数时,您也不会出现编译错误。