当我有一个指向类的指针时,是否可以在不使用*的情况下调用operator []?
class MyClass
{
public:
void operator[](int n)
{
cout<<"In []";
}
};
int main()
{
MyClass *a=new MyClass;
(*a)[2];//work
a[2];//It just do some pointer arithmetic ...too bad :((
}
答案 0 :(得分:6)
是的,您应该可以使用->
运算符,如下所示:
a->operator[] (2);
如果你只需要消除星号,这应该可以解决问题。如果您的目标是提高可读性,那么这没有多大帮助 - 您需要避开指针,或者使用常规成员函数:
class MyClass
{
public:
void operator[](int n)
{
cout<<"In []";
}
// Add a regular function for use with pointers
// that forwards the call to the operator[]
void at(int n) { (*this)[n]; }
};
现在你可以写a->at(2);
答案 1 :(得分:1)
template<typename LHS> struct at_lhs_t { LHS lhs; };
static struct at_t {} at;
template<typename LHS>
at_lhs_t<LHS> operator%( LHS&& lhs, at_t )
{ return {std::forward<LHS>(lhs)}; }
template<typename LHS, typename RHS>
auto operator%( at_lhs_t<LHS>&& lhs, RHS&& rhs )
->decltype( (std::forward<LHS>(lhs.lhs))->operator[](std::forward<RHS>(rhs)) )
{ return ( (std::forward<LHS>(lhs.lhs))->operator[](std::forward<RHS>(rhs)) ); }
class MyClass
{
public:
void operator[](int n)
{
std::cout<<"In []";
}
};
int main()
{
MyClass *a=new MyClass;
a %at% 2;
}
live example,但这可能不是你想要的。
在实践中,只需使用*
即可。 *
(以及->
s)有助于提醒您,必须首先检查左侧是否有效,然后才能在大多数情况下使用它。在检查指针是否有效后,您可以取消引用并将其存储在当前范围持续时间的引用中,并使用[]
到您的心脏内容。
(*a)
括号变得有点烦人。另一方面,你可能也应该避免使用指针:现代C ++已经不再使用指针,而是将内容包装在智能指针或pImpl包装器中,并将数据存储在值语义类型中。
然后,您只处理智能指针存储类型中的指针,以及何时需要可重新配置间接到其他位置的资源。你的漂亮和漂亮的pImpl
包装器被更频繁地使用,即使它们的大多数状态是动态保持的,它们也会像值一样。