使用mutable可以接受IO吗?

时间:2019-06-14 23:09:55

标签: c++ io const paint mutable

背景:我正在开发一个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的类。一旦我有了更好的完成事件的构想,这就是我打算改变的事情。

0 个答案:

没有答案