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],但这可能不会有太大的改进......