C++如果在赋值的LHS和RHS上,我可以重载bracket[]运算符来做不同的事情吗



我希望完成以下任务:

int x, y, z;

  1. foo[x] = y;的作用类似于do_this(x,y);

  2. z = foo[x];的作用类似于z = do_that(x)

我可以用Foo类和Helper类完成第一个,其中operator[]按值返回用x构建的Helper类,并且Helper类的operator=被定义为运行do_this(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;
};

我想不出的是如何完成。有没有办法让operator[]过载,这样它就知道它是在lhs上还是在rhs上使用的?

是-给Helper类一个到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];func_taking_int(foo[x])等。

一个潜在的问题是,auto或函数模板的某些使用仍然只保留类型Helper,这可能不是我们想要的-因此Foo的用户仍然应该理解这种代理糖正在发生。在FooHelper中,使用一些替代语法显式地获取类似情况下的int值也可能很有帮助。

我不确定我是否理解您实际想要做什么,但您可能可以使用operator[]const版本,而不是非const版本。例如:

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";,以及许多其他小事情,但其要点是以上。

最新更新