C++ 获取指向非静态成员函数的函数指针

C++ 获取指向非静态成员函数的函数指针,c++,function-pointers,member-function-pointers,C++,Function Pointers,Member Function Pointers,假设我有一门课: class A { public: A(); void myFunc(); }; 然后在程序中的另一个点上,我创建了一个类a的实例,并尝试获取一个指向myFunc()的函数指针: A*A=新的A; //尝试检索A::MYFUNC的函数指针 std::函数fnptr=a->myFunc; std::function fnptr(std::bind(A::myFunc,&A); 但这两种尝试都会出现错误“调用非静态成员函数而不使用对象参数” 也许这两种尝试都是

假设我有一门课:

class A {
public:
    A(); 
    void myFunc();
};
然后在程序中的另一个点上,我创建了一个类a的实例,并尝试获取一个指向
myFunc()
的函数指针:

A*A=新的A;
//尝试检索A::MYFUNC的函数指针
std::函数fnptr=a->myFunc;
std::function fnptr(std::bind(A::myFunc,&A);
但这两种尝试都会出现错误“调用非静态成员函数而不使用对象参数”


也许这两种尝试都是完全错误的,但本质上我试图在
a
的特定实例中获取指向
myFunc()
函数的函数指针。请提供有关如何操作的任何帮助:)

您需要以下语法:

std::function<void()> fnptr(std::bind(&A::myFunc, a));
这是一个例子

我正在尝试获取指向
myFunc()
函数的函数指针

a::myFunc()
获取指向成员函数的指针可以执行以下操作:

void (A::*memFuncPtr)() = &A::myFunc;
或者更好地利用
auto

auto memFuncPtr = &A::myFunc;
但是,要取消引用该指针(即调用它指向的成员函数),最终需要一个
A
对象。此对象对应于将调用成员函数的对象

您可以将指向成员函数的指针
memFuncPtr
A
对象和
*
运算符结合使用来取消引用:

A a;
a.*memFuncPtr();
或者与指向
对象的指针和运算符
->*
结合使用:

A *aPtr = new A();
aPtr->*memFuncPtr();
因此,您需要保留对该对象的引用或其副本,以便从指向成员函数的指针中创建
std::function

std::invoke
从C++17开始,您可以简单地使用函数模板而不是
*
/
->*
。它统一了上述两种情况的语法:

std::invoke(memFuncPtr, a);
std::invoke(memFuncPtr, aPtr);

std::bind(A::myFunc)中,&A
A
已经是一个指针。不需要另一个级别的间接寻址。看看作为
bind
std::function fnptr=[A]{A->myFunc();}的更有效的替代方法
进一步阅读,了解处理原始函数指针时的更多技巧和工具:@user4581301感谢链接。我扩展了引入
std::invoke
的答案。非常感谢,lambda是一个完美的实现。也许只是一个后续问题:如果我想将该函数指针传递给函数
fnPtrHandler
,fnPtrHandler的原型是什么样子的?如果你想把它传递给一个函数,那么签名应该是
void f(void(a:*)();
。当然,你可以传递
std::function
或者只制作
f
一个模板。
A *aPtr = new A();
aPtr->*memFuncPtr();
std::invoke(memFuncPtr, a);
std::invoke(memFuncPtr, aPtr);