我希望完成以下任务:
int x, y, z;
-
foo[x] = y;
的作用类似于do_this(x,y);
-
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
的用户仍然应该理解这种代理糖正在发生。在Foo
或Helper
中,使用一些替代语法显式地获取类似情况下的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";,以及许多其他小事情,但其要点是以上。