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)
    ,等等-这些用法将
    先做这个
    ,然后
    做那个