English 中文(简体)
C++:从类内部方便地访问operator[]的方法?
原标题:
  • 时间:2009-03-03 03:46:22
  •  标签:

我有一个C ++类,它重载了operator [] ,即数组下标/方括号运算符。这在我的类外部非常方便,我可以写foo [bar ]。然而,我无法弄清楚在我正在实现的方法内部如何使用这个符号。

我知道我可以写operator[](bar)this->operator[](bar),但它们相当不灵活,从一开始就剥夺了运算符的很多便利性。(我也知道我可以添加一个调用运算符的新方法。)我能否以类似的方式编写this[bar]this->[bar]或类似的东西?

最佳回答
(*this)[bar];

对我来说很好用。

问题回答

使用

(*this)[bar]

调用实例对象的operator[]

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

我使用at()函数,并在幕后调用operator[],因此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)

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

一个替代(*this)[bar]的方法是使用一个具有operator[]功能的命名成员函数。 过载运算符会让用户的使用更加便捷。更重要的是,它们是你的类的一部分接口。请问自己,在公共接口中实现类真的是有意义的吗?如果不是,我建议编写一个单独的(受保护或私有)成员函数来完成工作,然后让operator[]和任何其他函数调用它。

 operator[](bar) 

这也应该可以。它对我有效!

你可以使用 (* this)[bar] ,但那可能不会有多大的改进...





相关问题