是否可以覆盖在 C++ 中获取结构成员的默认行为?
Is it possible to override the default behavior of getting a struct member in C++?
类似于 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
只写 getters 和 setter 是最好的解决方案吗?
简短的回答是否定的,你不能那样做。
对于可以作为数组访问的二维向量,我会这样做:
struct Vec2 {
float x;
float y;
const float &operator[](const size_t i) const {
static_assert(sizeof(Vec2) == 2 * sizeof(float));
assert(i < 2);
return (&x)[i];
}
float &operator[](const size_t i) {
return const_cast<float &>(std::as_const(*this)[i]);
}
};
所以可以直接访问成员变量,也可以使用重载的下标运算符
Vec2 v{4, 5};
v.x += 9;
v[1] = -3;
通常,getters 和 setters 被显式调用。我见过很多的命名约定是给 getter 和 setter 相同的名称。
class Foo {
public:
int member() const {
return hidden;
}
void member(const int value) {
hidden = value;
}
private:
int hidden;
};
这种命名约定使访问非常干净,但仍然清楚地表明正在进行函数调用。
Foo f;
f.member(5);
int five = f.member();
类似于 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
只写 getters 和 setter 是最好的解决方案吗?
简短的回答是否定的,你不能那样做。
对于可以作为数组访问的二维向量,我会这样做:
struct Vec2 {
float x;
float y;
const float &operator[](const size_t i) const {
static_assert(sizeof(Vec2) == 2 * sizeof(float));
assert(i < 2);
return (&x)[i];
}
float &operator[](const size_t i) {
return const_cast<float &>(std::as_const(*this)[i]);
}
};
所以可以直接访问成员变量,也可以使用重载的下标运算符
Vec2 v{4, 5};
v.x += 9;
v[1] = -3;
通常,getters 和 setters 被显式调用。我见过很多的命名约定是给 getter 和 setter 相同的名称。
class Foo {
public:
int member() const {
return hidden;
}
void member(const int value) {
hidden = value;
}
private:
int hidden;
};
这种命名约定使访问非常干净,但仍然清楚地表明正在进行函数调用。
Foo f;
f.member(5);
int five = f.member();