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
    映射中
  • 我知道这可能是一个繁琐的方法,但是C++是可行的吗?或者是否有任何方法将
    原始memeber函数指针
    与其他键值一起存储,以便将它们用作
    回调
    。因为在
    debug
    时,调试器已经知道作为
    register\u func
    模板函数参数传递的函数名是什么。 请看附件中的图片。

    • 因此,简单地说,我们如何仅使用原始成员/非成员函数指针实现回调
      注册
      /
      取消注册
      场景

    (如果解决方案或方法是一种跨平台的方法,请至少基于Win32)您可以使用:

    boost::stacktrace::frame提供有关函数的信息。您可以从函数指针构造该类,并在运行时获取函数名


    C++没有。无法从指向函数的指针获取函数名。通常的解决方案是将名称作为参数与函数一起传递。调试器可以从编译器与可执行程序文件(在其中或作为单独文件)一起保存的额外信息中获取名称,但此信息通常在发布版本中不可用。“如何解决函数名称范围解析问题,这意味着如何调用重载函数/指向此类函数的指针?”使用
    static_cast
    如果您发现它很混乱,请避免使用您的方法解决问题。您可以使用宏来定义RegisterFunc(obj,func)register_func和_name(obj,func,#func)
    “因为在调试时,调试器已经知道传递的函数名是什么…”所以你想让你的程序只有在启用调试的情况下才能运行?@Oliv这对重载解析有什么帮助?非常感谢,我们能自己实现吗?@Buddhika是的。您需要了解可执行文件fomat和调试信息。Boost是开源的,所以只需关注源代码内部。希望它有很好的文档记录。@Oliv对于
    register
    unregister
    这样的原始函数指针回调方法有更好的模式吗?