使用函数指针进行结构初始化

Har*_*rry 2 c++ syntax function-pointers

我发现以下C++代码的语法我以前从未见过.有人关心如何详细说明这项工作吗?

功能1

glm::vec3 BottomCircleOffset(float fElapsedTime)
{
    return glm::vec3(.0f,.0f,.0f);
}
Run Code Online (Sandbox Code Playgroud)

功能2

glm::vec3 OvalOffset(float fElapsedTime)
{
    return glm::vec3(.1f, .1f, .1f);
}
Run Code Online (Sandbox Code Playgroud)

实例结构

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

到现在为止一切都很好.我知道OffsetFunc是一个函数指针的typedef,它将 float作为参数并返回一个glm :: vec3.我也理解CalcOffset是这样一个函数的变量.

然后代码创建一个Instance类型数组,如下所示:

Instance g_instanceList[] =
{
    {StationaryOffset},
    {OvalOffset},
    {BottomCircleOffset},
};
Run Code Online (Sandbox Code Playgroud)

这是我以前从未遇到过的语法:

  • 我们如何通过简单地添加函数名来初始化实例类型?
  • Instance结构甚至没有一个带有函数指针的构造函数,它如何知道将CalcOffset初始化为这个值?

Mik*_*our 5

Instance是一个聚合 - 它包含公共数据成员,但没有构造函数,析构函数或其他复杂性,因此可以(在许多方面)被视为struct在C中.

特别是,它可以通过为括在括号中的成员指定值列表来进行聚合初始化.一个简单的例子:

struct s {int a,b,c;};
s example = {1,2,3};    // initialises a=1, b=2, c=3
Run Code Online (Sandbox Code Playgroud)

数组也可以进行聚合初始化:

int a[3] = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

并且,如果数组成员是聚合,那么它们中的每一个都可以依次进行聚合初始化:

s a[3] = {{1,2,3},{4,5,6},{7,8,9}};
Run Code Online (Sandbox Code Playgroud)

您的示例与此相同:Instance数组中的每个都是聚合初始化的,使用提供的函数指针初始化CalcOffset成员.