如何在C ++中为类成员使用多个名称

时间:2011-12-06 07:11:55

标签: c++ macros

所以我有一个vec4类,它使用你可以使用

访问的成员x,y,z,w

point.x point.y等。

但是我想重用这个vec4类作为我的颜色类(它已经支持标量乘法,运算符重载了许多其他好东西) 我只是想用其他符号来引用成员:

color.r color.g color.b

无论如何,我可以使用宏或其他语法糖来做到这一点吗?

3 个答案:

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