所以我有一个vec4类,它使用你可以使用
访问的成员x,y,z,wpoint.x point.y等。
但是我想重用这个vec4类作为我的颜色类(它已经支持标量乘法,运算符重载了许多其他好东西) 我只是想用其他符号来引用成员:
color.r color.g color.b
等
无论如何,我可以使用宏或其他语法糖来做到这一点吗?
答案 0 :(得分:0)
如果您使用的是Visual Studio(并且确定它是唯一的目标IDE ...),您可以使用以下内容:
#include <cassert>
union vec4
{
struct
{
float x;
float y;
float z;
float w;
};
struct
{
float r;
float g;
float b;
float a;
};
};
int main()
{
vec4 vec = { 0 };
vec.y = 10.0f;
assert(vec.g == 10.0f);
return 0;
}
它会产生警告warning C4201: nonstandard extension used : nameless struct/union
,但你可以禁用它。
编辑:因为它也证明了这个扩展名为gcc supports。
答案 1 :(得分:0)
除非你在矢量和颜色之间有很多共同的行为,否则我认为这是一个坏主意。但既然你问过,这可能就是这样做的。
如果将x,y,z和w成员设为私有并提供访问器方法,那么很容易提供两种方法来引用相同的成员变量。例如:
class vec4 {
private:
float _x, _y, _z, _w;
public:
// vector getter/setters
float& x() { return _x; }
float& y() { return _y; }
float& z() { return _z; }
float& w() { return _w; }
// color getter/setters
float& r() { return _x; }
float& g() { return _y; }
float& b() { return _z; }
float& a() { return _w; }
};
vec4 my_color;
my_color.r() = 1.0f;
my_color.g() = 0.0f;
my_color.b() = 0.0f;
my_color.a() = 1.0f;
答案 2 :(得分:0)
您可以使用独立访问器功能轻松完成此操作:
struct vec4 { double x, y, z; };
double& get_r(vec4& v) { return v.z; }
// and so on