【问题标题】:C99 style variable-length array function signature in C++C++ 中的 C99 样式可变长度数组函数签名
【发布时间】:2014-08-16 03:20:53
【问题描述】:

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

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

dim1dim2 是运行时参数。这很好,因为任何使用此类函数的用户都会立即了解A 的维度,因此无需阅读 cmets/文档即可推断出更多信息。如果 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);

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

【问题讨论】:

  • 为什么不使用告诉您其大小/尺寸的类型?那么就不需要“提示”了。
  • @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[]

标签: c++ c arrays c99


【解决方案1】:

你可以使用std::array:

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

【讨论】:

  • dim1dim2 是运行时参数,std::array 是常量(如在编译时)大小数组的容器。
【解决方案2】:

在 C++ 中,您可以使用 void func(Matrix const&amp; A)。维度将在矩阵本身中编码,因此无需单独传递它们。这样既保证了尺寸的准确性,又简化了调用习惯。

【讨论】:

  • 我当然同意你的观点,但这不是我想问的。函数签名void mix(int apples, int oranges, float mixture[apples * oranges]);void mix(Matrix&lt;float&gt; mixture); 传达更多信息,对吧?
  • @Sebastian,矩阵固有地具有已知大小的两个维度和这些维度相乘的总大小。这些维度的额外参数和乘法都是多余的。
  • @chris 我知道这一切。不过,我现在明白了我想要什么。我想命名矩阵的维度。
  • @Sebastian:确实,函数签名本身传达的信息更少。信息将来自参数类型。这通常被认为是一件好事。
  • 你没事。我很确定我想要这个:typedef int dim1; typedef int dim2; void func(Matrix&lt;dim1, dim2&gt; A); 我完全同意@MikeSeymour - 谢谢!
猜你喜欢
  • 2011-12-13
  • 2012-01-29
  • 2015-12-18
  • 1970-01-01
  • 2021-07-11
  • 2018-12-16
  • 2012-12-14
  • 2021-04-02
  • 2014-03-27
相关资源
最近更新 更多