gpt4 book ai didi

c++ - 什么时候调用 const operator[],什么时候调用 non-const operator[]?

转载 作者:行者123 更新时间:2023-11-30 00:41:40 25 4
gpt4 key购买 nike

我有两种非常不同的读取和写入行为。在读取的情况下,我想复制一个很难提取数据结构的缓冲区。在写入时,我将只写入无缓冲的结构。

到目前为止,我一直在使用 operator[] 进行访问,所以为了多态性,我想继续这样做。

所以我的问题是:访问时调用的是哪个版本?我的想法是 const 用于读取,非 const 用于写入。在那种情况下,这很容易实现。否则,它可能会更棘手。

最佳答案

要完成你想要的,你通常需要让 operator[] 返回一个代理,并重载 operator=operator T (其中 T 是该代理类型的原始类型)。然后,您可以使用 operator T 来处理读取,并使用 operator = 来处理写入。

编辑:代理的基本思想非常简单:您返回一个对象的实例来代替原始对象。目前,这将具有非常微不足道的语义(只需在 vector 中的指定索引处读取和写入一个字符);在您的情况下, 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

关于c++ - 什么时候调用 const operator[],什么时候调用 non-const operator[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com