覆盖operator []和调用方法

时间:2018-02-04 11:19:43

标签: c++

我实施了SpareArray课程。它是一个很大的,所以没有任何意义来展示它,但重要的是有insert方法,这使得可以在任何索引处插入值(从零到“无穷大”)。所以,我的客户端代码可能如此:

auto arr = new SpareArray<int>{};
arr.insert(100, 1);

上述代码在索引1处插入值100。现在,我希望能够使用方形行李符号来获得相同的结果:

auto arr = new SpareArray<int>{};
arr[100] = 1; //I want this line to internally call arr.insert(100, 1);

那么,如何将operator[]与内部调用insert方法区分开来?我需要这个调用,因为insert方法有一些业务逻辑,我希望在这种情况下也能发生这种业务逻辑(如果是[])。

1 个答案:

答案 0 :(得分:1)

您可以返回最后一次调用insert的代理,并充当数组元素的包装。

template<typename T>
struct Proxy {
  Proxy(SpareArray<T> &This, std::size_t Index) : This(This), Index(Index) {}

  T &operator=(const T &Value) {
    This.insert(Index, Value);
    return This.get(Index); // or however you get an element
  }

  operator T&() { return This.get(Index); }
  operator const T&() const { return This.get(Index); }

private:
  SpareArray<T> &This;
  std::size_t Index;
};

为简单起见,我没有添加更多内容,但我希望这样的类具有适当的noexcept语义和移动赋值运算符。您还可能希望确保删除复制构造函数等。