cpp 对象成员函数作为参数传递

发布时间 2023-03-28 10:34:54作者: xzsxzxs

对象的成员函数可以通过将其作为函数指针或者函数对象来传递。具体有以下两种方式:

  1. 作为函数指针传递

可以使用类似于普通函数指针的语法,将成员函数的指针传递给另一个函数。需要注意的是,由于成员函数包含一个隐式的 this 指针,因此我们需要提供一个对象指针来调用该函数。

例如,考虑以下代码:

class MyClass {
public:
  void myFunction(int arg) {
    std::cout << "Argument: " << arg << std::endl;
  }
};

void callFunction(void (MyClass::*f)(int), MyClass* obj, int arg) {
  (obj->*f)(arg);
}

int main() {
  MyClass obj;

  // 传递成员函数指针
  callFunction(&MyClass::myFunction, &obj, 42);

  return 0;
}

在这个例子中,callFunction 函数接受一个成员函数指针 f 和一个对象指针 obj 作为参数,并调用该成员函数指针。在 main 函数中,我们创建了一个 MyClass 对象 obj,并将它和成员函数指针一起传递给 callFunction 函数。

  1. 作为函数对象传递

C++11 引入了 lambda 表达式和 std::function 类型,使得将成员函数作为函数对象传递变得更加方便。需要注意的是,此时我们需要使用 std::bind 或者类似于 boost::bind 的函数将对象指针和成员函数绑定在一起。

例如,考虑以下代码:

#include <functional>

class MyClass {
public:
  void myFunction(int arg) {
    std::cout << "Argument: " << arg << std::endl;
  }
};

void callFunction(std::function<void(int)> f, int arg) {
  f(arg);
}

int main() {
  MyClass obj;

  // 将成员函数作为函数对象传递
  auto boundFunc = std::bind(&MyClass::myFunction, &obj, std::placeholders::_1);
  callFunction(boundFunc, 42);

  return 0;
}

在这个例子中,我们定义了一个 MyClass 对象 obj 和一个成员函数指针 &MyClass::myFunction。然后,我们使用 std::bind 函数将它们绑定在一起,并得到一个函数对象 boundFunc。最后,我们将该函数对象和一个参数一起传递给 callFunction 函数。