获取在运行时作为参数传递的重载函数的名称

时间:2019-05-26 13:39:48

标签: 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)
    {
        //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");
}

问题与讨论

  1. @ Point A如何解决函数名称范围解析问题,即如何调用重载函数/此类函数的指针?没有内联的静态强制转换,因为它会使人有点丑陋和混乱。
  2. @ Point B假设我们已经解决了重载名称解析问题,现在我们必须存储 成员功能名称 其指针值 callbackReg地图中。

我知道这可能会带来麻烦,但在C ++中可行吗?否则,有任何方法可以将 raw memeber funtion pointers 与其他一些键值存储在一起,以便将其用作callbacks。自debug以来,调试器已经知道作为register_func模板函数参数传递的函数名称是什么。 请看所附图片。 enter image description here

  • 因此,简单地讲,我们如何仅使用原始成员/非成员函数来实现回调register / unregister 指针?

(如果解决方案或方法论是跨平台的方法,将不胜感激,至少应基于Win32)

1 个答案:

答案 0 :(得分:1)

您可以使用boost backtrace

  

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