【发布时间】:2014-08-16 03:20:53
【问题描述】:
在 C99 中,我们可以这样编写函数签名:
void func(int dim1, int dim2, float A[dim1 * dim2]);
dim1 和 dim2 是运行时参数。这很好,因为任何使用此类函数的用户都会立即了解A 的维度,因此无需阅读 cmets/文档即可推断出更多信息。如果 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);
正如答案中提到的,信息必须是类型 - 当然。
【问题讨论】:
-
为什么不使用告诉您其大小/尺寸的类型?那么就不需要“提示”了。
-
@MikeSeymour 正如我所说,dim1 和 dim2 是运行时参数。它们在编译时是未知的,不能编码在类型中。
-
@Sebastian,然后不需要在类型中编码它。例如,
std::vector具有运行时大小。你仍然可以检索它并执行它就好了。 -
@Sebastian:对不起,我应该更详细一点。我的意思是“使用具有接口的类型,该接口可用于确定给定实例的大小/尺寸,与标准容器的
size()成员一致”,不一定是静态编码信息的类型。跨度> -
float A[X]in parameters in C 与float* A字面意思相同。我敢打赌这在 C++ 中也成立(出于兼容性原因)。您可以只在其他地方记录类型或创建一个扩展为空的宏#define PARAM_DIM(x):float A[PARAM_DIM(x * y)]->float A[]