gpt4 book ai didi

c++ - 这个特殊的结构是如何发挥作用的呢? (arcsynthesis现代3D图形编程)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:24 26 4
gpt4 key购买 nike

我正在使用 arcsynthesis 的教程来学习现代 3D 图形编程,虽然我理解了其中的大部分内容,但我遇到了作者称之为“复杂管理代码”的障碍,我无法理解这段代码的工作原理:

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;
}
};


Instance g_instanceList[] =
{
{StationaryOffset},
{OvalOffset},
{BottomCircleOffset},
};

我不太明白函数指针是如何在 g_instanceList[] 的结构中设置的,我不太明白它在语法上是如何工作的,也不知道这个 g_instanceList 在下一段中是如何使用的:

float fElapsedTime = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;
for(int iLoop = 0; iLoop < ARRAY_COUNT(g_instanceList); iLoop++)
{
Instance &currInst = g_instanceList[iLoop];
const glm::mat4 &transformMatrix =
currInst.ConstructMatrix(fElapsedTime);

glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(transformMatrix));
glDrawElements(GL_TRIANGLES, ARRAY_COUNT(indexData), GL_UNSIGNED_SHORT, 0);
}

到此为止,我认为我已经非常熟悉 C++,但这种语法糖对我来说是新的。提前致谢:)

最佳答案

I don't quite get how the function pointer is getting set inside the struct in the g_instanceList[]

Instancean aggregate type .它可能有一个成员函数,但这并不意味着它不是一个聚合。在C++98/03中,聚合类型的对象可以用聚合初始化来初始化:

struct Aggregate
{
int x;
int y;
};

Aggregate agg = { 5, 4 };
assert(4 == agg.y); //Will be true.

结构中的每个成员都用每个单独的值初始化,按照这些成员在结构中声明的顺序。 5 进入 x,4 进入 y

Instance 是一个集合。它只有一个成员。该成员恰好是函数指针类型,但 C++ 不关心;它是一个值,可用于聚合初始化。

C++ 数组也是聚合。所以你可以用聚合初始化来初始化一个数组:

int arr[4] = {3, 45, 9, 81};

C++ 还允许您使用聚合初始化来初始化数组,其中数组的大小由初始化程序确定:

int arr[] = {5, 2};
//arr will have 2 elements.

因此,g_instanceList 是一个数组,因此也是一个聚合体,需要进行聚合体初始化。它的大小将由聚合初始化语法提供的值的数量决定。数组的每个元素也是一个聚合,因此数组的每个元素都可以被聚合初始化。

Instance g_instanceList[] =
{
{StationaryOffset},
{OvalOffset},
{BottomCircleOffset},
};

聚合初始化列表的每个成员本身就是一个聚合初始化,它初始化一个 Instance 对象。 StationaryOffset 和其余的是与Instance 成员的签名相匹配的函数指针。这就是 Instance::CalcOffset 的填充方式。


how this g_instanceList is used in the next segment here

它的使用方式是非常常见的 C++。第一行获取对其中一个 Instance 数组元素的引用。这样做只是为了使代码更短;它不必每次都使用 g_instanceList[iLoop] 来谈论它正在使用的 Instance。第二行调用了Instance的成员函数(它本身调用了内部函数指针),将结果存储在一个变量中。

如果您谈论的是 ARRAY_COUNT,那只是一个方便的宏,可以获取...好吧,数组元素的计数。 C++ 编译器知道 g_instanceList 有多大,所以使用宏让编译器自己计算它。这样,如果 g_instanceList 数组长度发生变化,您不必遍历整个代码库来查找数组长度的每次使用。此外,您永远不必直接说明长度;您可以通过聚合初始化来推断它。

关于c++ - 这个特殊的结构是如何发挥作用的呢? (arcsynthesis现代3D图形编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18117438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com