c++中C99风格的变长数组函数签名

C99 style variable-length array function signature in C++

本文关键字:数组 函数 C99 风格 c++      更新时间:2023-10-16

在C99中我们可以这样写函数签名:

void func(int dim1, int dim2, float A[dim1 * dim2]);

dim1dim2为运行参数。这很好,因为任何使用这种函数的用户都可以立即了解A的维度,因此无需阅读注释/文档就可以推断出进一步的信息。如果dim1dim2是语义超出此处所示的参数,则尤其如此。

是否有可能在c++中编写一个接口,提示函数期望的向量/张量的维数和大小?维度可能可以编码为模板参数(我不喜欢的东西,但这是另一个主题),但大小?什么好主意吗?

更新:

我想我必须让它更清楚。c++函数应该是这样的:

void func(int dim1, int dim2, std::vector<float> A);

和两个维度中的一个甚至可以省略(因为它是A.size()/dim)。但是签名并没有告诉用户函数所期望的向量的大小。当然我可以assert(A.size() == dim1*dim2);和类似的东西。我问的不是这个。我想问的是如何让这个界面更有信息量。

更新2:

所以我很确定我想要的是这个:

typedef int dim1; 
typedef int dim2; 
void func(Matrix<dim1, dim2> A);

正如在答案中所提到的,信息必须是-当然。

在c++中,您将执行void func(Matrix const& A)。维度将在矩阵本身中编码,因此不需要单独传递它们。这既保证了维度的准确性,又简化了调用习惯用法。

您可以使用std::array:

void func(std::array<int, /* dimension */> &arr);