对象的成员函数可以通过将其作为函数指针或者函数对象来传递。具体有以下两种方式:
- 作为函数指针传递
可以使用类似于普通函数指针的语法,将成员函数的指针传递给另一个函数。需要注意的是,由于成员函数包含一个隐式的 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
函数。
- 作为函数对象传递
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
函数。