operator[]我有一个重载数组下标/括号运算符的 C++ 类。这在我的课外非常方便,我可以在那里写foo[bar]。但是,当我在我的类中实现方法时,我不知道如何使用这种表示法。
我知道我可以写operator[](bar),this->operator[](bar)但是这些都相当笨拙,并且首先剥夺了操作员的很多便利。(我也知道我可以添加一个调用运算符的新方法。)有没有一种我可以编写this[bar]或this->[bar]类似的好方法?
operator[]我有一个重载数组下标/括号运算符的 C++ 类。这在我的课外非常方便,我可以在那里写foo[bar]。但是,当我在我的类中实现方法时,我不知道如何使用这种表示法。
我知道我可以写operator[](bar),this->operator[](bar)但是这些都相当笨拙,并且首先剥夺了操作员的很多便利。(我也知道我可以添加一个调用运算符的新方法。)有没有一种我可以编写this[bar]或this->[bar]类似的好方法?
(*this)[bar];
对我来说很好。
采用
(*this)[bar]
调用operator[]实例对象的。
假设bar是一个整数(或者可以自动转换为一个),this[bar]将this指针视为一个数组并索引该数组的bar第 -th 个元素。除非this在数组中,否则将导致未定义的行为。如果bar不是类似整数,则预计会出现编译时错误。
我使用 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 中实现的方式......
另一种方法(*this)[bar]是使用命名成员函数来完成operator[]. 重载的运算符使您的用户更轻松。更重要的是,它们是您班级界面的一部分。问问自己,根据自己的公共接口来实现你的类是否真的有意义。如果没有,我建议编写一个单独的(受保护的或私有的)成员函数来完成这项工作,然后让operator[]任何其他函数调用它。
operator[](bar)
这也应该有效。这个对我有用!
您可以使用(*this)[bar],但这可能不会有太大的改进......