gpt4 book ai didi

C++ 索引类成员

转载 作者:太空狗 更新时间:2023-10-29 20:24:43 25 4
gpt4 key购买 nike

我有一个类 vector

class vector3f
{
public:
float x;
float y;
float z;
};

如果我想访问其中一个成员,我必须键入 vec.x、vec.y 和 vec.z。现在,我有一个算法应该访问每个索引的数据成员,例如:

for(int i = 0; i < 3; i++)
{
vec[i] = i*i;
}

在没有索引的情况下这样做会导致几个 if 条件:

for(int i = 0; i < 3; i++)
{
if(i == 0){vec.x = i*i;}
else if(i == 1){vec.y = i*i;}
else if(i == 2){vec.z = i*i;}
}

有没有办法索引数据成员,以便在编译时解析它们?我不想在 vector 类中使用数组,因为使用 vec.x、vec.y 和 vec.z 访问数据成员对程序员来说更方便。避免这些 if 条件的最佳解决方案是什么?

最佳答案

您可以为您的类重载 operator[] 以将那些 if 条件(或者最好是 switch)定位到一个地方:

class vector3f
{
public:
float x;
float y;
float z;

float& operator[] (size_t i)
{
switch (i) {
case 0: return x;
case 1: return y;
case 2: return z;
default: throw "something";
}
}

float operator[] (size_t i) const
{ return (*const_cast<vector3f*>(this))[i];
}

这是实现它的通用且安全的方法。

如果您的类实际上是标准布局类1,如您所展示的,并且如果您知道对齐和填充方案你的编译器/平台,如果你从这些知道 floats 将在内存中彼此排列,你也可以像这样实现运算符:

float& operator[] (size_t i)
{
return (&x)[i];
}

这将 x 视为 float 数组的开始。它会更快,但依赖于我上面提到的 ifs,并且不进行边界检查。


1 这基本上意味着它没有非空基类,没有 virtual 函数并且没有非标准的数据成员-布局类型。

关于C++ 索引类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26670367/

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