使用函数指针初始化结构 我找到了我以前从未见过的语法C++代码。有人愿意详细说明这是如何工作的吗

使用函数指针初始化结构 我找到了我以前从未见过的语法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);

功能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,它将浮点作为参数并返回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:不,不是。它转换为一。这很重要,因为函数可能会重载,然后一个名称可以转换为两个或多个不同的指针。