有没有办法在没有括号的情况下在C++中调用成员的getter/setter?
Is there a way to call member's getter/setter in C++ without parentheses?
我想通过 #including
IT在C 应用程序中运行一些GLSL代码 AS A C 代码,而无需修改。它没有特殊的布拉格马斯等等,但是有一些矢量类型。例如,vec3
和vec4
,分别意味着3和4浮子的元组,这是内存中的重叠群,对于某些线性代数任务而言便利。
很适合操作员超负荷,除了一件事外,一切都可以完成。考虑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 语言没有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;
}
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 无法为类成员调用函数
- C++ 类成员调用错误 C3861
- 用const_iterator成员调用类destructor时堆积损坏
- C++ 如何为类的所有成员调用方法
- 通过命名成员调用虚拟与地址或引用的区别
- 使用类成员调用函数
- 正在成员调用中实例化类
- 使用父类中的私有成员调用父构造函数
- 带有类 - 非静态成员调用的 typedef 函数声明
- C++:对非静态成员函数指针的成员调用
- 需要从静态成员调用函数(由静态指针引用)
- 用类成员调用构造函数,c++
- 将luabind派生成员调用为协同程序
- 为什么我没有得到编译错误时,我从const方法内部的ref成员调用非const方法
- 类成员函数正常工作,但当作为另一个类的数据成员调用时陷入无限循环