在C99中,我们可以这样编写函数签名:
正如答案中提到的,信息必须是特定类型的。
void func(int dim1, int dim2, float A[dim1 * dim2]);
dim1
和dim2
是运行时参数。这很好,因为任何使用此函数的用户都能立即了解A
的维度,并且可以在不阅读注释/文档的情况下推断出更多信息。特别是如果dim1
和dim2
是具有超出此处所示语义的参数。
是否可能在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);
正如答案中提到的,信息必须是特定类型的。
std::vector
具有运行时大小。您仍然可以检索它并很好地执行它。 - chrissize()
成员”,而不一定是静态编码信息的类型。 - Mike Seymourfloat A[X]
与float* A
是完全相同的。我敢打赌,在C++中也是如此(出于兼容性考虑)。你可以在其他地方记录类型,或者创建一个宏#define PARAM_DIM(x)
,将其扩展为空:float A[PARAM_DIM(x * y)]
->float A[]
。 - Tim Čas