【发布时间】:2019-08-04 16:42:51
【问题描述】:
我想通过#including 在 C++ 应用程序中运行一些 GLSL 代码作为 C++ 代码,无需修改。它没有特殊的编译指示等,但它有一些向量类型。例如vec3 和vec4,分别表示 3 和 4 个浮点数的元组,即内存中的 contig,方便一些线性代数任务。
除了一件事之外,几乎所有事情都可以通过运算符重载来完成。
考虑vec4 a 有4 个浮动成员:a.x、a.y、a.z 和a.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==1、y==2、z==3;
然后像这样设置:
vec4 a(1,2,3,4);
a.xyz=vec3(5,6,7); // a.set_xyz(vec3(5,6,7));
a 现在有x==5、y==6、z==7 和w==1;
我怎样才能支持这样的语法?
【问题讨论】:
-
我从来没有见过用 C++ 完成的。在设置器的情况下,我想可以为该类型重载 operator= 但是......我几乎不认为这是一个好主意。
-
似乎您正在寻找 c# 或 delphi 等语言支持的 property 语法。 C++ 不支持。
-
您可以在 C++ 中执行类似 C# 属性的操作。 Michael Litvin 在他的template to mimic properties 回答中展示了一个示例。但是,我不建议您这样做。它不是惯用的 C++。
-
你不能仅仅在 C++ 中发明新语法,不。
-
@πάνταῥεῖ 刚问过,也许是新标准中的新功能。顺便说一句,您可能不会将 C# 与 Delphi 进行比较。因为 C# 起源于解释器,(更像是 msdos 的 qbasic 模拟器玩具)。 delphi 是一个 pascal 扩展(turbo/borland pascal,最初直接编译为 16 位 asm),更像 C/C++ - 支持那些低级功能,如使用指针、位操作等。 Delphi 只是支持属性的最接近的“普通”语言(不是 java/c#/..)。我看不出任何理由,对 C++19 仍然缺乏这样的语法糖感到失望......
标签: c++ oop operator-overloading overloading getter-setter