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);