有没有办法在没有括号的情况下在C++中调用成员的getter/setter?

Is there a way to call member's getter/setter in C++ without parentheses?

本文关键字:成员 调用 getter setter C++ 情况下 有没有      更新时间:2023-10-16

我想通过 #including IT在C 应用程序中运行一些GLSL代码 AS A C 代码,而无需修改。它没有特殊的布拉格马斯等等,但是有一些矢量类型。例如,vec3vec4,分别意味着3和4浮子的元组,这是内存中的重叠群,对于某些线性代数任务而言便利。

很适合操作员超负荷,除了一件事外,一切都可以完成。考虑vec4 a有4个浮点会员:a.xa.ya.za.w;

在GLSL中,有一个流行的符号a.xyz,这意味着"取a.x,a.y,a.z并从它们中构造VEC3"。

某些语言,例如面向对象的Pascal(Delphi(具有这样的功能:在其中使用property关键字定义此类成员。因此,当编译器遇到它时,它会调用Getter,当它符合评估时 - 它调用Setter,并且一切看起来都像您正在阅读或编写常规成员变量。

我们如何在C 中写下?


class vec4 {
public:
    float x,y,z,w;
    property xyz read=get_xyz write=set_xyz; // ??? is there some way?
protected:
    vec3 get_xyz() const { return vec3(x, y, z); }
    void set_xyz(const vec3& v) { x = v.x; y=v.y; z=v.z; }
};

在代码中,我想这样写getter:

vec4 a(1,2,3,4);
auto b = a.xyz; // b = a.get_xyz();

b现在是类型vec3,具有x==1y==2z==3;

和类似的设置者:

vec4 a(1,2,3,4);
a.xyz=vec3(5,6,7); // a.set_xyz(vec3(5,6,7));

a现在有x==5y==6z==7w==1;


我如何支持这种语法?

这是一个可悲的事实,如此成熟,功能强大且广泛使用的C 语言没有property支持。即使是Delphi也有..幸运的是,我设法解决了任务(在不修改GLSL源的情况下,将Comply GLSL着色器汇编为C (。我认为它不会有与创建代理对象有关的速度/内存惩罚,并且很容易通过编译器优化(尽管不需要(。

我发现以下解决方案:

在线尝试!

#include <iostream>
#pragma pack(push, 4)
class vec3 {
public:
    float x,y,z;
    vec3() {}
    vec3(float x, float y, float z) :
        x(x), y(y), z(z)
    {}
};
class vec4 {
public:
    union {
        struct {
            float x, y, z, w;
        };
        vec3 xyz;
    };
    vec4() {}
    vec4(float x, float y, float z, float w):
        x(x), y(y), z(z), w(w)
    {}
};
#pragma pack(pop)
int main() {
    {
        vec4 a(1, 2, 3, 4);
        auto b = a.xyz; // b = a.get_xyz();
        std::cout << b.x << b.y << b.z << std::endl;
    }
    {
        vec4 a(1, 2, 3, 4);
        a.xyz = vec3(5, 6, 7); // a.set_xyz(vec3(5,6,7));
        std::cout << a.x << a.y << a.z << a.w << std::endl;
    }
    return 0;
}