使用别名引用 class 个成员
Refer to class members with aliases
我有一个向量class
class vec3
{
public:
FLOAT x, y, z;
vec3(FLOAT X = 0, FLOAT Y = 0, FLOAT Z = 0)
{
x = X;
y = Y;
z = Z;
}
};
而且我需要能够使用此向量作为空间维度(使用 x、y、z)或作为颜色(使用 r、g、b)或作为度量维度(使用 w、h、l)。
让此向量 class 包含 9 个成员会浪费内存。相反,我希望它包含 x、y 和 z,并如上所述引用它们。
我已经在网上搜索并找到了几乎合适的解决方案,请参阅C++ member variable aliases?
但问题是,如果我使用
struct Vertex {
float& r() { return values[0]; }
float& g() { return values[1]; }
float& b() { return values[2]; }
float& x() { return values[0]; }
float& y() { return values[1]; }
float& z() { return values[2]; }
float operator [] (unsigned i) const { return this->values_[i]; }
float& operator [] (unsigned i) { return this->values_[i]; }
operator float*() const { return this->values_; }
private:
float[3] values_;
}
那我只能读取struct成员,不能设置,如果我用
struct vertex
{
private:
float data[3];
public:
float &x, &y, &z;
float &r, &g, &b;
vertex() : x(data[0]), y(data[1]), z(data[2]), r(data[0]), g(data[1]), b(data[2]) {
}
float& operator [](int i) {
return data[i];
}
};
然后结构体在内存中增加,因为每个引用占用space。
实际上您的解决方案应该有效,因为您是通过引用返回的。唯一的警告是您必须在每次访问时使用 ()
。
class vec3
{
FLOAT _x, _y, _z;
public:
inline FLOAT &r() { return _x; }
inline FLOAT &g() { return _y; }
inline FLOAT &b() { return _z; }
inline FLOAT &x() { return _x; }
inline FLOAT &y() { return _y; }
inline FLOAT &z() { return _z; }
vec3(FLOAT X = 0, FLOAT Y = 0, FLOAT Z = 0)
{
_x = X;
_y = Y;
_z = Z;
}
};
int main(int argc, char **argv)
{
vec3 myVec(1, 2, 3);
printf("r = %f, g = %f, b = %f\n", myVec.r(), myVec.g(), myVec.b());
myVec.x() = 10;
printf("r = %f, g = %f, b = %f\n", myVec.r(), myVec.g(), myVec.b());
return 0;
}
输出:
r = 1.000000, g = 2.000000, b = 3.000000
r = 10.000000, g = 2.000000, b = 3.000000
我有一个向量class
class vec3
{
public:
FLOAT x, y, z;
vec3(FLOAT X = 0, FLOAT Y = 0, FLOAT Z = 0)
{
x = X;
y = Y;
z = Z;
}
};
而且我需要能够使用此向量作为空间维度(使用 x、y、z)或作为颜色(使用 r、g、b)或作为度量维度(使用 w、h、l)。
让此向量 class 包含 9 个成员会浪费内存。相反,我希望它包含 x、y 和 z,并如上所述引用它们。
我已经在网上搜索并找到了几乎合适的解决方案,请参阅C++ member variable aliases?
但问题是,如果我使用
struct Vertex {
float& r() { return values[0]; }
float& g() { return values[1]; }
float& b() { return values[2]; }
float& x() { return values[0]; }
float& y() { return values[1]; }
float& z() { return values[2]; }
float operator [] (unsigned i) const { return this->values_[i]; }
float& operator [] (unsigned i) { return this->values_[i]; }
operator float*() const { return this->values_; }
private:
float[3] values_;
}
那我只能读取struct成员,不能设置,如果我用
struct vertex
{
private:
float data[3];
public:
float &x, &y, &z;
float &r, &g, &b;
vertex() : x(data[0]), y(data[1]), z(data[2]), r(data[0]), g(data[1]), b(data[2]) {
}
float& operator [](int i) {
return data[i];
}
};
然后结构体在内存中增加,因为每个引用占用space。
实际上您的解决方案应该有效,因为您是通过引用返回的。唯一的警告是您必须在每次访问时使用 ()
。
class vec3
{
FLOAT _x, _y, _z;
public:
inline FLOAT &r() { return _x; }
inline FLOAT &g() { return _y; }
inline FLOAT &b() { return _z; }
inline FLOAT &x() { return _x; }
inline FLOAT &y() { return _y; }
inline FLOAT &z() { return _z; }
vec3(FLOAT X = 0, FLOAT Y = 0, FLOAT Z = 0)
{
_x = X;
_y = Y;
_z = Z;
}
};
int main(int argc, char **argv)
{
vec3 myVec(1, 2, 3);
printf("r = %f, g = %f, b = %f\n", myVec.r(), myVec.g(), myVec.b());
myVec.x() = 10;
printf("r = %f, g = %f, b = %f\n", myVec.r(), myVec.g(), myVec.b());
return 0;
}
输出:
r = 1.000000, g = 2.000000, b = 3.000000
r = 10.000000, g = 2.000000, b = 3.000000