类方法的回调(c++)

Callbacks from a class method (C++)

本文关键字:c++ 回调 类方法      更新时间:2023-10-16

我有一个Button类。当我点击这个按钮时,它的selected()方法被调用。

//Button.cpp
void Button::selected(){
//Do Something
}
//Player.cpp
void Player::Jump(){
//Jump!
}

我也有一个Player类。我希望当我点击按钮时,播放器方法的Jump()被称为。我想我可以把Player类和按钮链接起来。但后来我意识到按钮类还有很多其他用途,而不是只是让我的球员跳起来。(例如:菜单选择器?让玩家移动?等)

所以我在考虑包括某种回调,但是我对它们不太熟悉,而且我在理解我读过的一些教程时遇到了麻烦。

有人能告诉我如何使用selected()方法将任何函数/方法作为参数并在方法体中执行吗?

这是一个函子方法,你传递一个函数作为参数:

template <typename functor_t>
void Button::selected(functor_t func){
  // ...
  func();
  // ...
}

实参可以是函数指针,也可以是函数对象:

 struct functor {
   void operator()() {
     // stuff
   }
 };
 void function() {
   // stuff
 }

使用指向成员的指针调用void method():

struct foo {
  void bar() {
    std::cout << "hello";
  }
};
template <typename class_t>
void function(class_t& c, void (class_t::* mp)()) {
  (c.*mp)();
}
foo x;
function(x, &foo::bar);