假设我有一个类:
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);
但是这两次尝试都会出现错误“调用没有对象参数的非静态成员函数”
也许这两种尝试都完全没有意义,但本质上我试图在 a
的特定实例中获取指向 myFunc()
函数的函数指针。任何有关如何执行此操作的帮助都将受到赞赏:)
最佳答案
I'm trying to obtain a function pointer to the
myFunc()
function
获取 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()>
出了 this 指向成员函数的指针。
std::invoke
从 C++17 开始,您可以简单地使用 std::invoke()
函数模板而不是 .*
/->*
。它统一了上面公开的两种情况的语法:
std::invoke(memFuncPtr, a);
std::invoke(memFuncPtr, aPtr);
关于c++ - 获取指向非静态成员函数的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63527325/