如何在C++同一个类中将成员方法作为参数传递给另一个方法?
你这段代码的核心问题是非静态成员函数不能直接当作普通函数指针传递——这类函数隐含了一个指向类实例的this指针参数,和普通函数的签名完全不匹配。下面给你几种可行的实现方式:
1. 使用成员函数指针(原生C++方式)
这是最直接的原生实现,需要明确声明成员函数指针的类型:
class A { public: // 参数声明为:A类的无参、返回int的成员函数指针 int foo(int (A::*func)()) { // 通过当前实例的this指针调用传入的成员函数 return (this->*func)(); } int bar() { return 1; } int faz() { return 2; } }; // 使用示例 int main() { A a; a.foo(&A::bar); // 传入bar的成员函数指针 a.foo(&A::faz); // 传入faz的成员函数指针 return 0; }
这种方式严格绑定当前类的成员函数类型,优点是不需要额外头文件,缺点是灵活性有限,只能传递当前类的成员函数。
2. 使用std::function + std::bind(C++11及以上)
这种方式支持任意可调用对象(成员函数、普通函数、lambda等),灵活性更高,需要包含<functional>头文件:
#include <functional> class A { public: // 参数为:无参、返回int的可调用对象包装器 int foo(std::function<int()> func) { return func(); } int bar() { return 1; } int faz() { return 2; } }; // 使用示例 int main() { A a; // 用std::bind绑定实例指针和成员函数 a.foo(std::bind(&A::bar, &a)); a.foo(std::bind(&A::faz, &a)); return 0; }
3. 使用Lambda表达式(C++11及以上)
这是目前最常用的写法,简洁直观,同样需要C++11及以上支持:
#include <functional> class A { public: int foo(std::function<int()> func) { return func(); } int bar() { return 1; } int faz() { return 2; } }; // 使用示例 int main() { A a; // 用lambda捕获实例,直接调用成员函数 a.foo([&a]() { return a.bar(); }); a.foo([&a]() { return a.faz(); }); return 0; }
如果是在A类的其他成员函数内部调用foo,可以直接捕获this指针,写法更简洁:
int A::another_member() { return foo([this]() { return this->bar(); }); }
特殊情况:静态成员函数
如果你的成员函数是静态成员函数,它没有隐含的this指针,可以直接当作普通函数指针传递:
class A { public: int foo(int (*func)()) { return func(); } static int static_bar() { return 3; } }; // 使用示例 int main() { A a; a.foo(&A::static_bar); return 0; }
内容的提问来源于stack exchange,提问作者I._.I
相关产品推荐
相关产品推荐

