问题描述
我正在使用typedef'd的函数指针:
i'm using function pointers typedef'd:
typedef int(* ptr2Func)();
typedef int(*ptr2Func)();
还有一个函数,当给定一个数字时,它将为已经声明的函数选择一个函数指针.
And a function which when given a number will select a function pointer for a function that is already declared.
ptr2Func getPtr2Func(int函数);
ptr2Func getPtr2Func(int function);
因此,如果您使用getPtr2Func(1);您会获得指向第一个函数的函数指针.
So if u use getPtr2Func(1); u get a function pointer to the first function.
但是,我现在想做完全相反的事情:将一个函数指针引用传递给一个函数,该函数将依次返回该函数的编号.即:我有4个测试功能,除了显示一条消息外什么也不做.如果getPtr2Func(1);调用,将获得指向function1的函数指针.
However i want now to do the exact reverse thing: Pass a function pointer reference into a function which will in turn return the number of the function.i.e: i got 4 test functions which do nothing other than display a message.if getPtr2Func(1); is called, a function pointer to function1 is obtained.
我可以这样做吗?int getFuncNum(ptr2Func *& func);
Can i do this:int getFuncNum(ptr2Func*& func);
从而获得该函数指针指向的函数的编号?假设我知道所有映射到getPtr2Func中给定数字的函数,我可以使用切换用例或多个if-else来查找那些函数的哪个地址与作为参数传递的函数指针匹配,否?
And thus get the number of the function that this function pointer points to? Assuming i know all the functions which are mapped to the number given into getPtr2Func, I could use a switch case or multiple if-else to find which address of those functions matches the function pointer passed as argument, no ?
这样做的正确语法是什么?
Also what would the correct syntax for doing so be ?
提前谢谢! :)
没关系,我找到了答案...
Nevermind i found the answer...
只需按原样传递并比较地址...
Just passing it as it is and comparing addresses...
typedef int(*ptr2Func)();
int findFunc(ptr2Func func){ if (func == &test1){ return 1; } }
我做过一些次要测试...(test1()是一个函数...)尽管不知道有没有更有效或更安全的方法来实现此目的...
Works with some minor testing i did... (test1() is a function...) Don't know if there is a more efficient or safer way to do this though...
推荐答案
要了解这种东西是如何工作的,最好看看回调管理器是如何构建的.通常,当您编写这样的回调函数时,您将传递实例和方法的静态地址.您将要创建一个类似于以下内容的回调管理器:
To understand how this kind of stuff works, it's best to look at how a callback manager is built. Usually when you write a callback function like this you pass the instance and the static address of the method. You'll want to create a callback manager that looks something like this:
...
class MyCallbackClass
{
public:
typedef void (MyClass::*CallbackFunction)(int arg);
MyCallbackClass(MyClass * callbackObj, void(CallbackFunction callbackFunction)
{
mCallbackObj = callbackObj;
mCallbackFunction = callbackFunction;
};
private:
MyClass * mCallbackObj;
CallbackFunction mCallbackFunction;
};
...然后在主类中添加一个回调函数...
...then add a callback function into your main class...
// The callback -- outputs "3" (see below)
void MyClass::myFunc(int arg)
{
cout << arg << "\n";
}
...然后创建回调管理器的实例
...then create an instance of the callback manager
// Implementation
MyCallbackClass myCallback = new MyCallbackClass(this, &MyClass::myFunc);
...您的回调管理器现在可以在您传入的实例/方法上调用函数...
...your callback manager can now call a function on the instance/method you passed in...
// (call this from the instance of MyCallbackClass)
(mCallbackObj->*mCallbackFunction)(3);
此代码都是在stackoverflow上手写的,因此不要指望它可用于复制/粘贴.
This code is all hand written right here at stackoverflow so don't expect it to work with a copy/paste.
这篇关于C ++如何创建一个以对函数指针的引用作为参数的函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!