何时调用const操作符[],何时调用非常量操作符[]?
我有两个非常读取和写入的不同行为。在读取的情况下,我想复制一个很难提取数据结构的缓冲区。在写入时,我只会写入无缓冲的结构。何时调用const操作符[],何时调用非常量操作符[]?
到目前为止,我一直在使用operator []来进行访问,所以为了多态性,我想继续这样做。
所以我的问题是这样的:当进行访问时,哪个版本被调用?我的想法是,const被称为读取,非const用于写入。在这种情况下,这是一个简单的实现。否则,它可能会更棘手。
来完成你想要什么,你通常需要有operator[]
返回一个代理,和过载operator=
和operator T
(其中T
是原始型)为代理类型。然后你可以使用operator T
来处理读取,而operator =
来处理写入。
编辑:代理的基本思想非常简单:您返回代替原始对象的对象实例。目前,这将有真正的微不足道的语义(只读和向一个向量指定的索引写一个字符);在你的情况下,operator=
和(特别是)operator T
内部的逻辑显然会更复杂,但对基本结构几乎没有影响。
#include <vector>
class X {
std::vector<char> raw_data;
class proxy {
X &parent;
int index;
public:
proxy(X &x, int i) : parent(x), index(i) {}
operator char() const { return parent.raw_data[index]; }
proxy &operator=(char d) {
parent.raw_data[index] = d;
return *this;
}
};
public:
X() : raw_data(10) {}
proxy operator[](int i) { return proxy(*this, i); }
};
#ifdef TEST
#include <iostream>
int main() {
X x;
for (int i=0; i<10; i++)
x[i] = 'A' + i;
for (int i=0; i<10; i++)
std::cout << x[i] << "\n";
return 0;
}
#endif
重载分辨率基于this
参数,即 - 关于您称为operator[]
的对象的常量或缺少常量。
这取决于你在 “分配” 到什么:
const type& x=X[i]
会调用该函数的const版本
type& x=X[i]
或
X[i]=x
将调用非const版本。最后,一个简单的任务
type x=X[i]
有没有真正的方式来说,一个是“读”,另一个是“写”。基本上,const版本会将视图返回到您的数据中,而不会反映更新。非常量版本会将视图返回到您的数据中,在此处可以反映更新,但写入后没有提供刷新的语义。
由于读取和写入操作的行为是如此不同,你可能要至少考虑不超载operator[]
而是使独立read
和write
方法。
要回答你的问题,它基于你操作的对象的一致性。它不知道你将如何处理操作符的结果,因此它只有一件事情要处理,即调用操作符的对象。如果对象是非const的,它将始终调用操作符的非常量(写入)版本。你可以通过将const加到对象上,但是单独的方法似乎是一种更好的方法。