【问题标题】:C++: Convenient way to access operator[] from within class?C++:从类内访问 operator[] 的便捷方式?
【发布时间】:2010-10-10 22:34:57
【问题描述】:

我有一个重载数组下标/括号运算符operator[] 的C++ 类。这在我的课外非常方便,我可以在那里写foo[bar]。但是,当我在我的类内部实现方法时,我不知道如何使用这种表示法。

我知道我可以写operator[](bar)this->operator[](bar),但它们相当笨拙,并且首先剥夺了操作员的许多便利。 (我也知道我可以添加一个调用运算符的新方法。)有没有办法可以写 this[bar]this->[bar] 或类似的好东西?

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:
    (*this)[bar];
    

    对我来说很好。

    【讨论】:

    • @TanishqBanyal 的答案大多是“因为它不起作用”:-)。更具体地说,这是因为operator-> 的返回类型是一个指针。你可以这样做...this->operator[](bar] 但这太可怕了。 (例如:godbolt.org/z/n4K7W9Yd3
    【解决方案2】:

    使用

    (*this)[bar]
    

    调用实例对象的operator[]

    假设bar 是一个整数(或可以自动转换为1),this[bar]this 指针视为一个数组并索引该数组的第bar 个元素。除非 this 在数组中,否则这将导致未定义的行为。如果bar 不是整数,则预计会出现编译时错误。

    【讨论】:

    • operator[] 的重载可能会接受整数类型以外的东西作为参数,因此它可能根本无法编译,更不用说转到该“数组”的第 bar 元素了。跨度>
    • @user904963 好点。我已经更新了最后一段。
    【解决方案3】:

    您可以使用 (*this)[bar],但这可能不会有太大改进...

    【讨论】:

      【解决方案4】:

      (*this)[bar] 的替代方法是使用命名成员函数来完成operator[] 的工作。重载的运算符使您的用户更轻松。更重要的是,它们是您班级的界面的一部分。问问自己,根据自己的公共接口来实现你的类是否真的有意义。如果没有,我建议编写一个单独的(受保护的或私有的)成员函数来完成这项工作,然后让operator[] 和任何其他函数调用它。

      【讨论】:

        【解决方案5】:

        我使用 at() 函数,并让 operator[] 在后台调用 at() 函数,因此 operator[] 只是语法糖。这就是 std::vector 的做法,所以这似乎是一种合理(优先)的方式。

        现在是一个完整的语法糖破解(不能说我完全推荐它,但可能会让你喜欢):

        class Widget
        {
            Widget&     self;
        public:
            Widget() :self(*this)
            {}
        
            void operator[](int)
            {
                printf("hello");
            }
        
            void test()
            {
                //scripting like sugar
                //you pay the price of an extra reference per class though
                self[1]; 
            }
        };
        
        
        int main(int argc, char* argv[])
        {
            Widget w;
            w[1];
            w.test();
            return 0;
        }
        

        另外,如果你想免费做到这一点,不支付参考费用,AND 是一些致力于让程序员受苦的邪恶教派的追随者,你可以这样做:

        #define self (*this)
        

        实际上我认为大多数句柄在 Apple 的 NS API 中都是这样实现的...

        【讨论】:

        • 从某种意义上说,我确实喜欢这样,因为过去几分钟我一直在做的事情是设置 self = *this 然后使用 self.谢谢。
        • Vector 是相反的,因为 vector::at() 必须在调用 operator[]() 之前进行范围检查
        • 注意Widget& self 版本:如果您仍然希望能够复制您的课程,请使用operator= 等,您将不得不编写许多额外的新样板。
        【解决方案6】:
         operator[](bar) 
        

        这也应该有效。它对我有用!

        【讨论】:

        • 在我的问题中,这是我提到的第一个选项。
        猜你喜欢
        • 2011-11-24
        • 2021-02-17
        • 2012-12-31
        • 2014-03-24
        • 2018-07-17
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多