C++ C++;如果括号[]运算符在赋值的左侧和右侧上重载,是否可以执行不同的操作?
我希望实现以下目标:C++ C++;如果括号[]运算符在赋值的左侧和右侧上重载,是否可以执行不同的操作?,c++,operator-overloading,C++,Operator Overloading,我希望实现以下目标: intx,y,z foo[x]=y的行为类似于这样做(x,y) z=foo[x]的行为类似于z=do_(x) 我可以使用Foo类和Helper类来完成第一步,其中操作符[]通过值返回一个Helper类,该类由x构造,并且Helper类的操作符=被定义为运行执行此操作(this->x,y)。如下图所示: class Foo { public: Helper operator[](int x) { return Helper(x);
intx,y,z代码>
foo[x]=y代码>的行为类似于这样做(x,y)代码>
z=foo[x]
的行为类似于z=do_(x)
我可以使用Foo
类和Helper
类来完成第一步,其中操作符[]
通过值返回一个Helper
类,该类由x
构造,并且Helper
类的操作符=
被定义为运行执行此操作(this->x,y)
。如下图所示:
class Foo {
public:
Helper operator[](int x) {
return Helper(x);
}
};
class Helper {
public:
Helper(x) {
this->x = x;
}
void operator=(int y) {
do_this(this->x, y);
}
private:
int x;
};
我不明白的是如何完成(2)。有没有办法重载操作符[]
以便它知道它是否用于lhs和rhs?我不确定我是否理解您实际想要做什么,但是您可能能够使用操作符[]
的常量版本,而不是非常量
版本。例如:
struct Foo {
Z operator [] (int x) const { // this last const is important
return do_that(x);
}
Helper operator [] (int x) {
// as you yourself have written.
}
};
这方面有更多的技巧和窍门,可以完美地转发参数(也称为“完美转发”),也可以是“const correct”,还有许多其他小事情,但要点如上所述。是-给你的助手
类a转换函数,将其转换为int
:
class Helper {
public:
Helper(x){
this->x = x;
}
Helper& operator= (int y) {
do_this(this->x, y);
return *this;
}
operator int() const {
return do_that(this->x);
}
private:
int x;
};
这也将允许其他用途,如product*=foo[x]代码>或函数获取int(foo[x])
等
一个潜在的问题是,auto
或函数模板的某些使用仍然会保留类型Helper
,这可能不是所需要的-因此Foo
的用户应该仍然理解这种代理糖正在发生。有一些替代的语法可以帮助你在<<代码> Foo或<代码>帮助器< /代码>中获得明文< <代码> int >代码>值。类声音,就像你想要C++有属性一样,你可以提供一个吸气剂和设置器。运算符int()后面的“const”表示什么?另外,为什么我需要在operator=function中返回一个Helper&在成员函数参数列表之后的const
意味着无论类是否作为const
访问,都可以调用它。在这里不太重要,因为可能没有人会有const-Helper
,但我习惯于尽可能地使用它,尤其是在“getter”上。从操作符返回*这个
使得它的行为更像是内置的赋值表达式,以防有人尝试int copy=foo[x]=param()
或如果((foo[x]=param())!=0)
,等等-这些用法将先做这个
,然后做那个
。