如何解决获取指向非静态成员函数的函数指针 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。