我正在使用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/

10-11 23:15
查看更多