我有一个重载operator[]
的C ++类,数组下标/括号运算符。这在我班级之外非常方便,我可以写foo[bar
]。但是,当我在我的类中实现方法时,我无法弄清楚如何使用这种表示法。
我知道我可以写operator[](bar)
或this->operator[](bar)
但这些相当笨拙并且首先会带走操作员的许多便利。 (我也知道我可以添加一个调用运算符的新方法。)有没有办法可以编写this[bar]
或this->[bar]
或类似的东西?
注意:这个问题也可能适用于许多一元运算符(例如,如何从类中调用foo++
?),但我个人只关心{{1 }}
编辑:我发布后很快意识到我可以使用operator[]
。到目前为止,所有答案都表明了这一点。还有其他选择吗?
答案 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)
这也应该有用。它对我有用!