【问题标题】:What elegant method callback design should be used?应该使用什么优雅的方法回调设计?
【发布时间】:2011-02-15 12:52:18
【问题描述】:

我很惊讶之前没有在 SO 上问过这个问题(好吧,至少我找不到)。

您是否曾经在 C++ 中设计过方法回调模式(类似于指向类方法的“指针”),如果有,您是如何做到的?

我知道一个方法只是一个常规函数,带有一些隐藏的this 参数作为上下文,我有一个非常简单的设计。然而,由于事情往往比看起来更复杂,我想知道我们的 C++ gurus 将如何实现这一点,最好以 优雅 和标准的方式实现。

欢迎所有建议!

【问题讨论】:

    标签: c++ design-patterns methods callback c++11


    【解决方案1】:

    boost::function用于单个回调,boost::signalboost::signals2用于注册多个回调,使用boost::bind绑定成员方法(或以不同方式适配签名)。

    如果您可以访问支持 C++0x/C++11 的编译器,它可能具有 std::function 和 std::bind,它们是 boost::function 和 boost::bind 的新标准版本

    【讨论】:

    • 谢谢。升压真的很惊人。这个库有什么不能做的吗?
    • 它还不能带来世界和平。有一个库正在开发中,但开发人员无法就语法达成一致。
    • @Phil - 不,他们刚刚开始为支撑样式争吵
    • @David:我还需要几年时间才能习惯 C++11 这个名字。只是想问你是否指的是某个特定编译器的版本 11 或者你在说什么...... ;)
    【解决方案2】:

    你可以找到here 对 C++ 回调的一个很好的介绍。当 boost 不是一个选项时,我使用这篇论文作为实现的基础。

    【讨论】:

      【解决方案3】:

      boost::function(结合boost::bind)不够优雅吗?这也将使您远离讨厌的(但符合标准的)实现细节,例如指向大于 void* 的成员的指针,这是旧 Windows CE 系统的回调库中的一个问题。我宁愿使用知名的库,也不愿自己处理这些问题。

      【讨论】:

      • “我宁愿使用知名的库,也不愿自己处理这些问题。”我完全同意。只是要知道,boost::function 是否需要我链接到 boost 或者它是否基于“模板”(就像boost::shared_ptr)?
      • @ereOn:我认为它只是基于模板的,因为我们在一个大型项目中使用它并且只链接到 boost::thread。但我不确定。
      • 它是基于模板和仅标题的。如果你有一个现代编译器,你可能也可以访问std::tr1::function(和std::tr1::bind)——无需等待C++0x
      • @Phil Nash 和@OregonGhost:谢谢你们俩。很高兴知道。我一定会用的。
      猜你喜欢
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多