IO 是否可以使用 mutable ?

Is using mutable acceptable for IO?

提问人:Michael Choi 提问时间:6/15/2019 最后编辑:Michael Choi 更新时间:6/15/2019 访问量:42

问:

背景:我正在开发一个用于体验的 UI Widget 工具包,我遇到的一个问题是事件的恒定性。所有事件都强制为常量,因此同一事件在小部件之间的传播将保持一致。

这对于鼠标事件和关键事件是可以的;但是,对于绘画事件,我无法保持恒定性,因为绘画事件本质上会改变它们所绘制的任何图形上下文。

在此示例中,我想创建一个可变的图形上下文,以便事件本身保持不变。我意识到可变的危险,所以如果这是不可接受的,我想听听反对可变的理由和它的替代品。

为了完整起见,下面是我的一些代码示例来说明这个问题:

namespace event {
  struct Mouse {
    struct Interface {
      virtual ~Interface() = 0;

      virtual void on_l_press(const Mouse&) {}
      virtual void on_l_release(const Mouse&) {}
      virtual void on_l_click(const Mouse&) {}
      virtual void on_l_drag(const Mouse&) {}

      virtual void on_m_press(const Mouse&) {}
      virtual void on_m_releas(const Mouse&) {}
      virtual void on_m_click(const Mouse&) {}
      virtual void on_m_drag(const Mouse&) {}

      virtual void on_r_press(const Mouse&) {}
      virtual void on_r_release(const Mouse&) {}
      virtual void on_r_click(const Mouse&) {}
      virtual void on_r_drag(const Mouse&) {}

      virtual void on_move(const Mouse&) {}
      virtual void on_enter(const Mouse&) {}
      virtual void on_exit(const Mouse&) {}
    };

    gmt::Point<float> point = { -1, -1 };
  };

  struct Paint {
    struct Interface {
      virtual ~Interface() = 0;

      virtual void on_paint(const Paint&) {}
    };

    gmt::Rect<float> dirty;
    mutable gfx::Context context;
  };
}

我听说过 Haskell 中的 IO Monads,但不幸的是,我对它们没有太多经验或理解。

另外,作为一个小说明,我意识到这些事件应该是带有 getter 和 setter 的类。一旦我对最终确定事件有了更好的想法,我就计划改变这一点。

C++(英语:C++) io 常数 可变

评论

0赞 Peter 6/15/2019
为什么在您的设计中,绘制 UI 小部件的行为需要更改传递给它的事件对象?你将其描述为内在要求。它不是 - 它是您设计的“功能”。绘制事件可能会导致小组件更改状态(即更新其显示缓冲区和显示),但小组件不需要更改传递给它的事件数据。
0赞 Michael Choi 6/15/2019
@Peter 小部件本身可能会改变,但我试图保证它不会改变绘画事件本身,因此是一个非常量函数。绘制 UI 的行为不应更改事件对象,这就是事件本身是 const 的原因。
0赞 Peter 6/15/2019
没有什么可以阻止非函数接受 const 参数。比如可以是非-(所以它可以改变指向的对象),但接受一个参数(所以它保证不改变)。您似乎以某种方式将两者混为一谈 - 您不希望消息更改,因此窗口函数必须是 const。如果解决了该概念性问题,则无需将数据标记为可变。constwindow->on_paint(Paint_Event)constwindowconstPaint_Event
0赞 Michael Choi 6/15/2019
@Peter 对不起,我不明白。我以为这就是我现在所拥有的。on_paint 是一个非常量函数(因此原型之后没有常量),但有一个常量事件。你能详细说明一下吗,对不起。
0赞 Peter 6/15/2019
你是那个询问可变数据的人,因为不知何故你需要改变一个常量对象。

答: 暂无答案