如何通过指针简化重载下标操作符的使用?

时间:2013-11-27 16:25:54

标签: c++ operator-overloading subscript

我有一个类Foo,它封装了对向量的访问,并通过下标运算符提供对它的访问:

typedef int* IntPtr; 

class Foo {
   std::vector<IntPtr> bars;
   IntPtr& operator[](size_t idx) {
      return bars[idx];
   }
};

在课程Bar中,我想使用Foo。虽然解决方案1有效,但它相当不方便。我更喜欢像解决方案2这样的东西。显然,方法调用(即使它返回一个左值)也不能被分配一些东西,尽管方法调用除了解决方案1之外什么都不做。

class Bar {
   Foo *foo; //some initialization

   IntPtr helper(size_t idx) {
      return (*foo)[idx];
   }

   void barfoo() {
      size_t baz = 1;
      IntPtr qux;

      //solution 1
      qux = (*foo)[baz];  //works
      (*foo)[baz] = &1;    //works

      //solution 2
      qux = helper(baz);  //works
      helper(baz) = &1;    //does not work: "expression is not assignable"
   }     
};

问题:如何简化重载下标运算符的使用?

编辑:已将使用的类型更改为intint*。对不起,我在创建示例时搞砸了。

我猜问题是因为扭曲的int*&

2 个答案:

答案 0 :(得分:1)

最好的方法是编写常规方法,例如Foo::at(size_t idx),提供与运算符相同的功能。 请注意,STL也是如此(只需看一下std::vector)。 然后,您只需致电foo->at(baz);即可。为避免冗长,您可以更改operator[]的实现:

int& operator[](size_t idx) {
    return at(idx);
}

在您的代码段中,您无法为返回值指定值,因为您忘记返回引用。

不是很好,但另一种选择是foo->operator[](baz);,尽管我强烈反对你写这么难看的代码。

答案 1 :(得分:0)

织补。我只是忘了让helper通过引用返回值:

IntPtr& helper(size_t idx) 

int*& helper(size_t idx)