我实施了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
方法有一些业务逻辑,我希望在这种情况下也能发生这种业务逻辑(如果是[]
)。
答案 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
语义和移动赋值运算符。您还可能希望确保删除复制构造函数等。