我正在使用函数指针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()是一个函数...)不知道是否有更高效或更安全的方法来做到这一点...
答案 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()是一个函数...) 不知道是否有更有效或更安全的方法来做到这一点......