我有一个C ++类,它重载了operator []
,即数组下标/方括号运算符。这在我的类外部非常方便,我可以写foo [bar
]。然而,我无法弄清楚在我正在实现的方法内部 em>如何使用这个符号。
我知道我可以写operator[](bar)
或this->operator[](bar)
,但它们相当不灵活,从一开始就剥夺了运算符的很多便利性。(我也知道我可以添加一个调用运算符的新方法。)我能否以类似的方式编写this[bar]
或this->[bar]
或类似的东西?
我有一个C ++类,它重载了operator []
,即数组下标/方括号运算符。这在我的类外部非常方便,我可以写foo [bar
]。然而,我无法弄清楚在我正在实现的方法内部 em>如何使用这个符号。
我知道我可以写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] strong>,但那可能不会有多大的改进...