我有一个带有两个重载括号运算符的自定义类——setter 和 getter。如您所知,它们看起来有点像这样
class IntContainer {
public:
int const & operator[] (size_t i) const;
int & operator[] (size_t i);
}
我现在面临的问题是,我必须检查值何时设置或何时刚刚访问,即我需要跟踪容器中的所有更改。这很困难,因为总是只调用非 const 运算符,例如
container[i] = 3; // Non const operator[] called
x = container[i]; // Again, non const operator[] called
在上面的两种情况下,我需要容器中不同的内部行为。那么在上述情况下有没有办法显式调用不同的运算符。我不想使用容器的 const
实例并定义其他函数,例如 set
和 get
,尽管我正在寻找 smoe right设计模式。
谢谢!
最佳答案
一个技巧是创建一个代理对象。这使您可以重载赋值运算符并将跟踪逻辑放入其中,然后您可以保证捕获任何写入。如果你有
class Proxy
{
int& val;
Proxy(int& val) : val(val) {}
Proxy& operator=(int new_val)
{
// do tracking stuff
val = new_val;
}
operator int() { return val; }
};
然后你可以将IntContainer
调整为
class IntContainer {
public:
int operator[] (size_t i) const;
Proxy operator[] (size_t i);
};
现在,当用户实际尝试分配到引用中时,您将调用跟踪代码。
关于c++ - 自定义容器中括号运算符的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58414965/