Как использовать несколько имен для членов класса в C ++ - PullRequest
0 голосов
/ 06 декабря 2011

Итак, у меня есть класс vec4, который использует члены x, y, z, w, к которым вы можете получить доступ, используя

point.x point.y и т. Д.

Однако я хочу повторно использовать этот класс vec4, чтобы быть моим классом цвета (он уже поддерживает скалярное умножение, оператор перегружает множество других приятных вещей) Я просто хочу иметь возможность ссылаться на участников, используя другую запись:

color.r color.g color.b

и т.д.

В любом случае я могу сделать это, используя макрос или другой синтаксический сахар?

Ответы [ 3 ]

0 голосов
/ 06 декабря 2011

Если у вас нет общего поведения между вектором и цветом, я думаю, что это плохая идея.Но так как вы спросили, вот один из возможных способов сделать это.

Если вы сделаете члены 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;
0 голосов
/ 06 декабря 2011

Вы можете легко сделать это с помощью автономных функций доступа:

struct vec4 { double x, y, z; };

double& get_r(vec4& v) { return v.z; }
// and so on
0 голосов
/ 06 декабря 2011

Если вы используете 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 поддерживает это расширение также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...