有没有办法在类指针类型的指针中调用类操作符而不使用*?

时间:2014-02-10 19:57:54

标签: c++ operator-overloading

当我有一个指向类的指针时,是否可以在不使用*的情况下调用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 :((
    }

2 个答案:

答案 0 :(得分:6)

是的,您应该可以使用->运算符,如下所示:

a->operator[] (2);

Demo on ideone.

如果你只需要消除星号,这应该可以解决问题。如果您的目标是提高可读性,那么这没有多大帮助 - 您需要避开指针,或者使用常规成员函数:

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);

Demo on ideone)。

答案 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包装器被更频繁地使用,即使它们的大多数状态是动态保持的,它们也会像值一样。

相关问题