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

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

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

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

有帮助吗?

解决方案

(*this)[bar];

对我来说很好。

其他提示

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

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

使用

(*this)[bar]

调用实例对象的 operator []

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

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

 operator[](bar) 

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top