在向量大括号初始化中将 C 数组传递给结构初始化程序
Posted
技术标签:
【中文标题】在向量大括号初始化中将 C 数组传递给结构初始化程序【英文标题】:Passing a C array to a struct initializer in a vector brace initialization 【发布时间】:2016-01-30 14:34:55 【问题描述】:首先,我见过this question。
我很好奇为什么以下方法不起作用:
float vcolor[4]color.getX(),color.getY(),color.getZ(),1.0f;
float v1[3]from.getX(),from.getY(),from.getZ();
float v2[3]to.getX(),to.getY(),to.getZ();
std::vector<Vertex> v=v1,vcolor,v2,vcolor;
没有匹配的构造函数用于初始化 'std::vector'
但是直接传递元素可以正常工作(如另一个问题中所述):
std::vector<Vertex> v=
from.getX(),from.getY(),from.getZ(),
color.getX(),color.getY(),color.getZ(),1.0f,
to.getX(),to.getY(),to.getZ(),
color.getX(),color.getY(),color.getZ(),1.0f;
不应该是前者也可以吗?
【问题讨论】:
v1,vcolor,v2,vcolor
没有形成初始化列表。
@Lingxi 谢谢但是.. 它们在另一对大括号内,这将是一个初始化列表,不是吗?
刚刚看了Vertex
的定义。问题是你不能复制初始化数组。
【参考方案1】:
这里是一个简单的解释。您可以使用聚合初始化语法将数组初始化为float arr[4] = 1.f, 2.f, 3.f, 4.f
。这就是Vertex v = 1.f, 2.f, 3.f, 1.f, 2.f, 3.f, 4.f
起作用的原因。你不能做的是从另一个数组复制初始化一个数组。所以
float arr[4] = 1.f, 2.f, 3.f, 4.f ;
float brr[4] = arr;
不起作用。因此,最终,在您的问题中,第一种形式不起作用。
【讨论】:
arr[4]
无论如何都不会命名第一个数组。它命名该数组的最后一个元素。你的最后一个例子应该是float brr[4] = arr;
@LightnessRacesinOrbit 我的错。感谢您的善意提及:-)【参考方案2】:
让我们更详细地看看你在这里尝试做什么:
std::vector<Vertex> v=
from.getX(),from.getY(),from.getZ(),
color.getX(),color.getY(),color.getZ(),1.0f,
to.getX(),to.getY(),to.getZ(),
color.getX(),color.getY(),color.getZ(),1.0f;
你尝试用两个元素初始化一个 Vector,这两个元素是用
初始化的from.getX(),from.getY(),from.getZ(),
color.getX(),color.getY(),color.getZ(),1.0f
和
to.getX(),to.getY(),to.getZ(),
color.getX(),color.getY(),color.getZ(),1.0f
这些也是初始化列表,C++ 试图将其转换为顶点。 Sinze 它们包含两个元素,它们本身是包含 3(4) 个浮点数的初始化列表。 (至少我假设你的getX/Y/Z()
返回浮点数),一切都很好,它们用于初始化每个顶点内的数组。这有点等价于调用
Vertexfrom.getX(),from.getY(),from.getZ(),
color.getX(),color.getY(),color.getZ(),1.0f;
float position[3]from.getX(),from.getY(),from.getZ();
float color[4]color.getX(),color.getY(),color.getZ(),1.0f;
现在让我们看看你的第二个案例:
std::vector<Vertex> v=v1,vcolor,v2,vcolor;
同样,每个包含初始化器列表都“映射”到一个顶点,调用如下:
Vertexv1,vcolor
但是 v1 和 vcolor 不是初始化列表,它们只是一个指向浮点的指针 (float*
)
就像你做不到一样
float v3[3]v1;
或更明显
float* f = new float;
float v[3]f;
无法从float*
初始化数组
您可以尝试改用 std::arrays 并使用其基于迭代器的构造。或者您可以尝试为您的 Vertex 编写适当的构造函数。或者您可以将初始值设定项列表存储为初始值设定项列表,直到您实际形成顶点。无论哪种方式,通过多个步骤构建您的 Vertex 将需要更多的工作。
【讨论】:
如果他的Vertex
有一个基于范围的构造函数,他可以为每个顶点使用std::begin(vX), std::end(vX), std::begin(vcolor), std::end(vcolor)
,即使是C 样式的数组。以上是关于在向量大括号初始化中将 C 数组传递给结构初始化程序的主要内容,如果未能解决你的问题,请参考以下文章