获取指向非静态成员函数的函数指针
Obtaining a function pointer to a non static member function
假设我有一个 class:
class A {
public:
A();
void myFunc();
};
然后在程序的不同点我创建了一个 class 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()
函数的函数指针。任何有关如何这样做的帮助都将不胜感激:)
您需要以下语法:
std::function<void()> fnptr(std::bind(&A::myFunc, a));
您也可以像这样使用 lambda 表达式:
auto fn = [a] { a->myFunc(); };
这是一个demo。
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()>
。
std::invoke
自 C++17 起,您可以简单地使用 std::invoke()
函数模板代替 .*
/ ->*
。它统一了上面公开的两种情况的语法:
std::invoke(memFuncPtr, a);
std::invoke(memFuncPtr, aPtr);
假设我有一个 class:
class A {
public:
A();
void myFunc();
};
然后在程序的不同点我创建了一个 class 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()
函数的函数指针。任何有关如何这样做的帮助都将不胜感激:)
您需要以下语法:
std::function<void()> fnptr(std::bind(&A::myFunc, a));
您也可以像这样使用 lambda 表达式:
auto fn = [a] { a->myFunc(); };
这是一个demo。
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()>
。
std::invoke
自 C++17 起,您可以简单地使用 std::invoke()
函数模板代替 .*
/ ->*
。它统一了上面公开的两种情况的语法:
std::invoke(memFuncPtr, a);
std::invoke(memFuncPtr, aPtr);