c++ - 将可调用对象传递给成员函数

标签 c++ bind functor

  class Action {
    public:
      void operator() () const;
  }

  class Data {
    public:
      Data();
      ~Data();
      Register(Action action) { _a = action; }

    private:
      Action _a;
   }

  class Display {
    public:
      Display(Data d) { d.Register( bind(Display::SomeTask, this, _1) ); }
      ~Display();
      void SomeTask();
  }

我想将 Data 的私有(private)成员 _a 绑定(bind)到 Display 的成员函数,但是当我调用 d.Register 时出现编译错误,说我的参数类型不匹配,我做错了什么?谢谢。

最佳答案

您尝试做的事情并不完全清楚,但我假设“绑定(bind)”是 boost::bind(或 tr1::bind)。

bind(Display::SomeTask, this, _1) 的几个问题:

  • 应该是 &Display::SomeTask
  • _1 占位符没有意义,因为它创建了一个一元函数对象并且:
    • Display::SomeTask 不带参数
    • Action::operator() 不接受任何参数

使用 Boost.Function 和 Boost.Bind,您可以编写以下内容来实现我猜您正在尝试做的事情:

typedef boost::function<void(void)> Action;

class Data {
public:
  Data();
  ~Data();
  Register(Action action) { _a = action; }

private:
  Action _a;
};

class Display {
public:
  Display(Data d) { d.Register( bind(&Display::SomeTask, this) ); }
  ~Display();
  void SomeTask();
};

关于c++ - 将可调用对象传递给成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1239380/

相关文章:

c++ - 我可以使自己的自定义数据类型比 C++ 中的数据类型更大吗?

c++ - 有没有办法让我的 win32 程序知道它启动的子进程已经崩溃(而不仅仅是退出)?

c++ - 堆栈帧是否在范围内分配和释放?

c++ - 如何使用函数指针映射正确使用 boost::bind

javascript - JavaScript 中的仿函数实现

c++ - 链接到 Boost 系统时出错

javascript - Jquery 每个循环不工作

c++11 - 为什么 C++ 标准不禁止这种可怕的用法?

c++ - 仿函数:将 std::function 包装在类中

haskell - 函数组合运算符 (.) 和 fmap (<$>) 的区别