假设所有包含项均已定义,请仔细阅读下面定义的代码结构。
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");
}
Point A
如何解决函数名称范围解析问题,即如何调用重载函数/此类函数的指针?没有内联的静态强制转换,因为它会使人有点丑陋和混乱。Point B
假设我们已经解决了重载名称解析问题,现在我们必须存储 成员功能名称 和 其指针值 在callbackReg
地图中。我知道这可能会带来麻烦,但在C ++中可行吗?否则,有任何方法可以将 raw memeber funtion pointers
与其他一些键值存储在一起,以便将其用作callbacks
。自debug
以来,调试器已经知道作为register_func
模板函数参数传递的函数名称是什么。
请看所附图片。
因此,简单地讲,我们如何仅使用原始成员/非成员函数来实现回调register
/ unregister
指针?
答案 0 :(得分:1)
您可以使用boost backtrace:
boost :: stacktrace :: frame提供有关函数的信息。您可以从函数指针构造该类并在运行时获取函数名称