48

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

我知道我可以写operator[](bar)this->operator[](bar)但是这些都相当笨拙,并且首先剥夺了操作员的很多便利。(我也知道我可以添加一个调用运算符的新方法。)有没有一种我可以编写this[bar]this->[bar]类似的好方法?

4

6 回答 6

70
(*this)[bar];

对我来说很好。

于 2009-03-03T03:47:52.443 回答
7

采用

(*this)[bar]

调用operator[]实例对象的。

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

于 2009-03-03T03:48:42.957 回答
4

我使用 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;
}

此外,如果您想免费执行此操作,无需支付参考费用,并且是某个致力于让程序员受苦的邪恶教派的追随者,您可以这样做:

#define self (*this)

实际上,我认为这就是大多数句柄在 Apple 的 NS API 中实现的方式......

于 2009-03-03T04:14:51.490 回答
3

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

于 2009-03-03T04:09:50.160 回答
2
 operator[](bar) 

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

于 2014-01-15T19:57:50.943 回答
1

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

于 2009-03-03T03:48:47.200 回答