使用函数指针初始化结构 我找到了我以前从未见过的语法C++代码。有人愿意详细说明这是如何工作的吗
功能1使用函数指针初始化结构 我找到了我以前从未见过的语法C++代码。有人愿意详细说明这是如何工作的吗,c++,syntax,function-pointers,C++,Syntax,Function Pointers,功能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);
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,它将浮点作为参数并返回glm::vec3。我也知道CalcOffset是这样一个函数的变量
然后,代码将创建一个实例类型数组,如下所示:
Instance g_instanceList[] =
{
{StationaryOffset},
{OvalOffset},
{BottomCircleOffset},
};
这是我以前从未遇到过的语法:
- 我们如何通过简单地输入函数名来初始化实例类型
- 实例结构甚至没有接受函数指针的构造函数,它如何知道将CalcOffset初始化为该值
结构的常规C风格初始化。回想一下,您可以像这样初始化struct
s数组:
struct x {
int a;
};
x data[] = {{1}, {2}, {3}};
您的代码使用相同的语法,但使用函数指针代替int实例
是一个聚合-它包含公共数据成员,但没有构造函数、析构函数或其他复杂结构,因此(在许多方面)可以被视为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}};
您的示例与此相同:使用提供的函数指针初始化CalcOffset
成员,对数组中的每个实例
进行聚合初始化。函数名是指向该函数的指针。这是。查一下。@HennoBrandsma:不,不是。它转换为一。这很重要,因为函数可能会重载,然后一个名称可以转换为两个或多个不同的指针。