C++ 获取在运行时作为参数传递的重载函数的名称
假设定义了所有包含,请检查下面定义的代码结构C++ 获取在运行时作为参数传递的重载函数的名称,c++,c++11,winapi,visual-c++,member-function-pointers,C++,C++11,Winapi,Visual C++,Member Function Pointers,假设定义了所有包含,请检查下面定义的代码结构 std::unordered_map<std::string, void*> callbackReg; class A { public: void foo(int a) { //impl } void foo(int a, int b) { //impl } void foo(int a, double d) { //imp
std::unordered_map<std::string, void*> callbackReg;
class A
{
public:
void foo(int a)
{
//impl
}
void foo(int a, int b)
{
//impl
}
void foo(int a, double d)
{
//impl
}
};
template<class Instance , typename Function>
void register_func(Instance& obj, Function func)
{
/* have to store function name as the key and
- pointer to raw member function pointer as the value,
- in callbackReg Map */
// ---> Point B
}
int main(int argc, const char * argv[])
{
A a;
register_evt(a, &A::foo); //---> point A
system("Pause");
}
std::无序映射回调reg;
甲级
{
公众:
无效foo(int a)
{
//恳求
}
无效foo(内部a、内部b)
{
//恳求
}
无效foo(整数a,双d)
{
//恳求
}
};
模板
无效寄存器_func(实例和对象,函数func)
{
/*必须将函数名存储为键和
-指向原始成员函数指针的指针作为值,
-在callbackReg映射中*/
//--B点
}
int main(int argc,const char*argv[]
{
A A;
寄存器_evt(a,&a::foo);//-->点a
系统(“暂停”);
}
问题和讨论
点A
如何解决函数名范围解析问题,这意味着如何调用重载函数/指向此类函数的指针?没有内联静态强制转换,因为它使一些丑陋和混乱点B
假设我们在问题中修复了重载名称解析,现在我们必须将成员函数名称和其指针值存储在callbackReg
映射中原始memeber函数指针
与其他键值一起存储,以便将它们用作回调
。因为在debug
时,调试器已经知道作为register\u func
模板函数参数传递的函数名是什么。
请看附件中的图片。
- 因此,简单地说,我们如何仅使用原始成员/非成员函数指针实现回调
注册
/
场景取消注册
C++没有。无法从指向函数的指针获取函数名。通常的解决方案是将名称作为参数与函数一起传递。调试器可以从编译器与可执行程序文件(在其中或作为单独文件)一起保存的额外信息中获取名称,但此信息通常在发布版本中不可用。“如何解决函数名称范围解析问题,这意味着如何调用重载函数/指向此类函数的指针?”使用
static_cast
如果您发现它很混乱,请避免使用您的方法解决问题。您可以使用宏来定义RegisterFunc(obj,func)register_func和_name(obj,func,#func)“因为在调试时,调试器已经知道传递的函数名是什么…”所以你想让你的程序只有在启用调试的情况下才能运行?@Oliv这对重载解析有什么帮助?非常感谢,我们能自己实现吗?@Buddhika是的。您需要了解可执行文件fomat和调试信息。Boost是开源的,所以只需关注源代码内部。希望它有很好的文档记录。@Oliv对于register
和unregister
这样的原始函数指针回调方法有更好的模式吗?