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

时间:2014-04-16 12:46:05

标签: c++ syntax function-pointers

我发现以下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},
};

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

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

2 个答案:

答案 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