【问题标题】:How to provide a std::vector to match this parameter?如何提供一个 std::vector 来匹配这个参数?
【发布时间】:2013-03-22 11:19:39
【问题描述】:

如何将给定的std::vector<float> 传递给函数以匹配参数类型float (*parameter)[3]

该函数用 3d 点的坐标填充参数,这就是参数类型为 3 元素长数组的数组的原因。该功能由a library提供,无法更改。

我已经初始化了向量以覆盖足够的元素。

【问题讨论】:

  • 是否可以选择更改函数的标题?
  • 传递向量本身然后在函数中获取所需元素会有什么问题?
  • 该函数由我无法修改的库提供。
  • 我不认为你可以将向量传递给需要其他参数的函数..
  • 如果你能修复 API,我建议修复 API。使用float (*parameter)[3] 不是一个好主意。

标签: c++ arrays vector stl parameters


【解决方案1】:
void f(float (*parameter)[3])
{
}

int main()
{
    vector<float> v(3);
    f(reinterpret_cast<float(*)[3]>(&v[0]));
}

【讨论】:

  • 这行不通...你不应该通过&amp;&amp;v[0]吗? &amp;v[0]float*,但 parameter 是指向浮点数组的指针。
  • 我认为指向数组的指针仍然是指向其第一个元素的指针。
  • 这在技术上不违反严格的别名规则吗?
  • @Neil:严格来说,指向数组的指针不是指向其第一个元素的指针(就像整数 1 与浮点数 1.0 不同,即使它们相等),但是该数组确实具有与其第一个元素相同的地址,因此您基本上是对的,这就是 reinterpret_cast 起作用的原因。
  • @jrok:我从来都无法完全满足自己的标准,即这不违反严格的别名,但如果提问者想要做的事情是可能的,那么这就是方式去做吧。无论向量的内容是通过float* 还是float(*)[3] 引用,对数组中对象值的所有访问最终都将通过float 类型的左值,因此它有可能符合标准...
【解决方案2】:

因为无法确定std::allocator&lt;T&gt; 在某些配置中涉及float[3],所以不可能在给定std::vector&lt;T&gt; 的情况下指向这样的数组。这不是找到正确的演员表或要转换的正确值的问题。

问题是像你描述的函数只能传递一个指向实际float[3]的指针,或者一个空指针。

您可以做的唯一严格遵守的事情是将数据复制到真正的float[3] 变量,并将指向它的指针传递给您的函数。

【讨论】:

  • 顺便说一句,您的示例代码不能解决问题,因为提问者的数组大于 3 个浮点数。库函数采用指向float[3] 数组的第一个元素的指针。但当然它给出了总体思路,并且可以编写更精细的代码,从向量复制进出真正的 float[3] 数组。
  • @SteveJessop 哎呀,我宁愿使用文字而不是代码。谢谢。
猜你喜欢
  • 2014-12-12
  • 1970-01-01
  • 2019-11-07
  • 2020-02-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多