C ++如何创建一个函数,该函数将参数作为参数引用函数指针?

时间:2011-01-13 19:53:00

标签: c++ function-pointers

我正在使用函数指针typedef'd:

typedef int(* ptr2Func)();

一个函数,当给定一个数字时,将为已经声明的函数选择一个函数指针。

ptr2Func getPtr2Func(int function);

所以,如果你使用getPtr2Func(1);你得到一个指向第一个函数的函数指针。

但是我现在想要完全相反的事情:将函数指针引用传递给一个函数,该函数将返回函数的编号。 即:我有4个测试功能,除了显示信息外什么都不做。 if getPtr2Func(1);被调用,获得了一个函数指针function1。

我可以这样做: int getFuncNum(ptr2Func *& func);

从而获得此函数指针指向的函数的数量?假设我知道映射到getPtr2Func中给出的数字的所有函数,我可以使用switch case或多个if-else来查找这些函数的哪个地址与作为参数传递的函数指针匹配,不是吗?

这样做的正确语法是什么?

提前致谢! :)

编辑:

没关系,我找到了答案......

按原样传递并比较地址......

typedef int(*ptr2Func)();

int findFunc(ptr2Func func){ if (func == &test1){ return 1; } }

使用我做过的一些小测试...(test1()是一个函数...)不知道是否有更高效或更安全的方法来做到这一点...

3 个答案:

答案 0 :(得分:1)

ptr2Func*& func

看起来很可怕,引用函数指针指向函数指针?

工作代码:

#include <iostream>
#include <vector>
using namespace std;

typedef int(*ptr2Func)();

int zero() { return 10; }
int one() { return 11; }
int two() { return 12; }
int three() { return 13; }

const ptr2Func functions[] = { zero, one, two, three };

//possible other logic
ptr2Func getPtr2Func(int number) { return functions[number]; }

//possible other logic (std::map, whatever)
int getPtr2FuncNum(ptr2Func func)
{
    for (size_t i = 0; i < sizeof(functions) / sizeof(*functions); ++i)
        if (functions[i] == func)
            return i;
    return -1;
}

int main()
{
    ptr2Func p = getPtr2Func(2);
    cout << p() << '\n'; //12
    cout << getPtr2FuncNum(p) << '\n'; //2

    return 0;
}

输出:

12
2

答案 1 :(得分:0)

要了解这类内容的工作原理,最好先了解一下如何构建回调管理器。通常当你编写这样的回调函数时,你传递实例和方法的静态地址。您需要创建一个类似于此的回调管理器:

...

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上手写的,所以不要指望它可以用于复制/粘贴。

答案 2 :(得分:-1)

没关系,我找到了答案......

按原样传递并比较地址......

typedef int(* ptr2Func)();

int findFunc(ptr2Func func){     if(func ==&amp; test1){         返回1;     } }

与我做过的一些小测试一起工作...... (test1()是一个函数...) 不知道是否有更有效或更安全的方法来做到这一点......