[英]Constness in brackets operator in custom container
我有一个自定义的 class 带有两个重载的括号运算符——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
,尽管我正在寻找正确的设计模式。
谢谢!
一个技巧是创建一个代理 object。 这使您可以重载赋值运算符并将跟踪逻辑放入其中,然后您可以保证捕获任何写入。 如果你有
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);
};
现在您将在用户实际尝试分配给参考时调用跟踪代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.