C ++:从类中访问operator []的便捷方式?

时间:2009-03-03 03:46:22

标签: c++ operator-overloading

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

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

注意:这个问题也可能适用于许多一元运算符(例如,如何从类中调用foo++?),但我个人只关心{{1 }}

编辑:我发布后很快意识到我可以使用operator[]。到目前为止,所有答案都表明了这一点。还有其他选择吗?

6 个答案:

答案 0 :(得分:53)

(*this)[bar];

对我来说很好。

答案 1 :(得分:3)

使用

(*this)[bar]

调用实例对象的operator[]

this[bar]this指针视为数组并索引该数组的bar个元素(返回可能无效的对象引用)。​​

答案 2 :(得分:3)

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

答案 3 :(得分:3)

我使用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中实现的......

答案 4 :(得分:1)

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

答案 5 :(得分:1)

 operator[](bar) 

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