【发布时间】:2020-01-09 23:58:25
【问题描述】:
类似于python中的@property标签,我试图弄清楚是否可以在不调用函数的情况下覆盖c++中getter的行为。
基本上,是否可以在 c++ 中执行以下操作:
class vector2(class):
def __init__(self):
self.values = [1,2]
@property
def x(self):
return self.values[0]
pos = vector2()
my_var = pos.x
只写 getter 和 setter 是最好的解决方案吗?
【问题讨论】:
-
您可以通过隐式转换来伪造它,但 IMO 不值得。有极端情况,并且可以抑制优化。最好使用惯用的 C++,也就是直接使用方法:stackoverflow.com/questions/8368512/…。 MSVC 确实 具有用于动态属性的非标准
declspec扩展,但 g++ 不支持它。 clang 在旗帜后面支持它。 -
特别是对于那个例子,你会重载
operator[],但一般来说,这在 C++ 中是不可能的 -
C++ 的方式是 getter 和 setter。
int get_x() const { return values[0]; }和void set_x(int value) { values[0] = value; } -
对于另一种方式的数组,重载
[],这个答案非常酷 - 使用指向成员的constexpr数组并进行查找。优化非常接近内联 getter 方法的功能:stackoverflow.com/a/48464023/1863938 -
请查看“告诉,不要问”文章。 getter 和 setter 只会浪费您的时间 - 所以只需将使用实例数据的代码放在对象中即可。
标签: c++ properties overriding getter