C ++:从类中访问operator []的便捷方式?
-
03-07-2019 - |
题
我有一个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)
这也应该有用。它对我有用!