繁体   English   中英

自定义容器中括号运算符中的常量

[英]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实例并定义其他函数,例如setget ,尽管我正在寻找正确的设计模式。

谢谢!

一个技巧是创建一个代理 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM