我发现以下C ++代码的语法我以前从未见过。有人关心如何详细说明这项工作吗?
功能1
glm::vec3 BottomCircleOffset(float fElapsedTime)
{
return glm::vec3(.0f,.0f,.0f);
}
功能2
glm::vec3 OvalOffset(float fElapsedTime)
{
return glm::vec3(.1f, .1f, .1f);
}
实例结构
struct Instance
{
typedef glm::vec3(*OffsetFunc)(float);
OffsetFunc CalcOffset;
glm::mat4 ConstructMatrix(float fElapsedTime)
{
glm::mat4 theMat(1.0f);
theMat[3] = glm::vec4(CalcOffset(fElapsedTime), 1.0f);
return theMat;
}
};
直到现在这一切都很好。我理解 OffsetFunc 是一个函数指针的typedef,它将float作为参数并返回一个glm :: vec3。我也理解CalcOffset是这种函数的变量。
然后代码创建一个Instance类型数组,如下所示:
Instance g_instanceList[] =
{
{StationaryOffset},
{OvalOffset},
{BottomCircleOffset},
};
这是我以前从未遇到过的语法:
答案 0 :(得分:5)
Instance
是聚合 - 它包含公共数据成员,但没有构造函数,析构函数或其他复杂性,因此可以(在很多方面)被视为struct
在C.
特别是,它可以是聚合初始化,方法是为括在大括号中的成员指定值列表。一个简单的例子:
struct s {int a,b,c;};
s example = {1,2,3}; // initialises a=1, b=2, c=3
数组也可以进行聚合初始化:
int a[3] = {1,2,3};
并且,如果数组成员是聚合,那么它们中的每一个都可以依次进行聚合初始化:
s a[3] = {{1,2,3},{4,5,6},{7,8,9}};
您的示例与此相同:数组中的每个Instance
都是聚合初始化的,使用提供的函数指针初始化CalcOffset
成员。
答案 1 :(得分:1)
这是struct
的常规C样式初始化。回想一下,您可以像这样初始化struct
数组:
struct x {
int a;
};
x data[] = {{1}, {2}, {3}};
您的代码使用相同的语法,但使用函数指针代替int
。