我正在使用typedef的函数指针:
typedef int(* ptr2Func)();
还有一个函数,当给定一个数字时,它将为已经声明的函数选择一个函数指针。
ptr2Func getPtr2Func(int函数);
因此,如果您使用getPtr2Func(1);你得到一个指向第一个函数的函数指针。
但是,我现在想做完全相反的事情:将函数指针引用传递给函数,该函数继而返回函数的编号。
即:我有4个测试功能,除了显示一条消息外什么也不做。
如果getPtr2Func(1);调用后,将获得指向function1的函数指针。
我可以这样做吗?
int getFuncNum(ptr2Func *&func);
从而得到该函数指针指向的函数的编号?假设我知道所有映射到getPtr2Func中给定数字的函数,我可以使用切换用例或多个if-else来查找那些函数的哪个地址与作为参数传递的函数指针匹配,不是吗?
另外,正确的语法是什么?
提前致谢! :)
编辑:
没关系,我找到了答案...
照原样传递并比较地址...
typedef int(*ptr2Func)();
int findFunc(ptr2Func func){ if (func == &test1){ return 1; } }
我做过一些次要测试...(test1()是一个函数...)尽管不知道有没有更有效或更安全的方法来执行此操作...
最佳答案
要了解这种东西是如何工作的,最好看看回调管理器是如何构建的。通常,当您编写这样的回调函数时,您将传递实例和方法的静态地址。您将需要创建一个如下所示的回调管理器:
...
class MyCallbackClass
{
public:
typedef void (MyClass::*CallbackFunction)(int arg);
MyCallbackClass(MyClass * callbackObj, void(CallbackFunction callbackFunction)
{
mCallbackObj = callbackObj;
mCallbackFunction = callbackFunction;
};
private:
MyClass * mCallbackObj;
CallbackFunction mCallbackFunction;
};
...然后在您的主类中添加一个回调函数...
// The callback -- outputs "3" (see below)
void MyClass::myFunc(int arg)
{
cout << arg << "\n";
}
...然后创建回调管理器的实例
// Implementation
MyCallbackClass myCallback = new MyCallbackClass(this, &MyClass::myFunc);
...您的回调管理器现在可以在您传入的实例/方法上调用函数...
// (call this from the instance of MyCallbackClass)
(mCallbackObj->*mCallbackFunction)(3);
这段代码都是在stackoverflow上手写的,因此不要指望它可用于复制/粘贴。
关于c++ - C++如何创建一个以对函数指针的引用作为参数的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4684576/