获取指向非静态成员函数的函数指针 std::invoke

问题描述

假设我有一堂课:

class A {
public:
    A(); 
    void myFunc();
};

然后在程序的另一点创建一个类A的实例,并尝试获取指向myFunc()的函数指针:

A* a = new A;

//ATTEMPTS AT RETRIVING FUNCTION POINTER FOR A::MYFUNC

std::function<void()> fnptr = a->myFunc;

std::function<void()> fnptr(std::bind(A::myFunc,&a);

但是这两种尝试都显示错误“没有对象参数的非静态成员函数的调用”

也许这两种尝试都完全没有用,但是本质上是试图在myFunc()的特定实例中获取指向a函数的函数指针。对此的任何帮助都将受到赞赏:)

解决方法

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

可以获取指向A::myFunc()的成员函数的指针:

void (A::*memFuncPtr)() = &A::myFunc;

甚至更好,利用auto

auto memFuncPtr = &A::myFunc;

但是,要取消引用该指针(即,调用其指向的成员函数),最终将需要一个A对象。该对象对应于将要调用成员函数的对象。

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

A a;
a.*memFuncPtr();

,或与指向A对象的指针和运算符->*组合:

A *aPtr = new A();
aPtr->*memFuncPtr();

因此,您需要保留对该对象或其引用的引用,以便从指向成员函数的指针中创建std::function<void()>

std::invoke

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

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

您需要以下语法:

std::function<void()> fnptr(std::bind(&A::myFunc,a));

您还可以使用如下lambda表达式:

auto fn = [a] { a->myFunc(); };

这里是demo

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...