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

标签 c++ c++11 c++14 c++17

我有一个带有两个重载括号运算符的自定义类——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,尽管我正在寻找 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/

相关文章:

c++ - 带有 unique_ptr 的 CRTP 导致段错误

c++ - 在我的主窗口中调用 Qt 小部件主窗口函数

c++ - 在 C/C++ 应用程序中使用 Fortran90 模块

存储任意引用的 C++ 包装类,但它本身不是类模板

c++ - 匹配别名模板作为模板参数

c++ - N4140 中 [basic.link]/8 中要点的目的是什么?他们似乎没有带来任何新的东西

c++ - 是否可以参数化模板化成员函数的常量?

c++ - 使用 Lib3ds 获取顶点数组

c++ - 与 const 和指针相关的问题

C++多线程中断