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

标签 c++ function-pointers pointer-to-member

假设我有一个类:

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/

相关文章:

c++ - 使用指向成员的指针将成员函数作为参数传递

c++ - 在C++中读取带空格的字符串

c++ - 没有模板的运算符重载

c++ - 指向非 union 类的指针的大小可以不同吗?

c++ - 为什么可以通过类类型获取成员函数的地址

c++ - 返回调用指向成员函数的指定指针的 std::function 包装的 lambda

c++ - c/c++微秒时间戳

C函数指针

c++ - 使用 C++ 模板的数据映射器设计模式

delphi - 在Delphi中保存指向指定函数的指针