C ++:重载下标运算符(不同的返回类型)

时间:2015-11-08 21:09:46

标签: c++ templates c++11 operator-overloading

我知道返回值不足以覆盖一个函数(我在stackoverflow上读取了关于它的不同线程),但有没有办法重载一个类的下标操作符,只是为了返回值(我可以“改为通过引用类型的函数返回”

它必须看起来像或至少像:

解决这个问题的最佳方法是什么(它必须是运营商)?

更新: 问题是,不允许仅使用返回类型重载成员或运算符。

struct A {int a; int b; double c;};
struct B {int a; int b; array<double,2> c;};

class Whatever
{
public:
A operator [](unsigned int ) const; //it's just reading the element
B operator [](unsigned int ) const;
}

A operator [](unsigned int Input){
//...
}

B operator [](unsigned int Input){
//...
}

1 个答案:

答案 0 :(得分:2)

假设您知道要访问哪种类型,您可以返回一个转换为任一类型的代理,并且可能在转换时进行访问。因为您想要访问应该相当直接的const对象。当尝试为更新界面做同样的事情时,事情变得更加混乱:

class Whatever;
class Proxy {
    Whatever const* object;
    int             index;
public:
    Proxy(Whatever const* object, int index)
        : object(object)
        , index(index) {
    }
    operator A() const { return this->object->asA(this->index); }
    operator B() const { return this->object->asB(this->index); }
};
class Whatever {
    // ...
public:
    Proxy operator[](int index) { return Proxy(this, index); }
    A asA(index) { ... }
    B asB(index) { ... }
};

主要限制是您无法直接访问AB的成员:您需要先转换为AB。如果实际知道这两种类型,则可以创建Proxy,以适当地转发相应的成员函数。当然,如果有通常命名的成员函数或数据成员,则需要先显式转换。