多年前VC++刚完善C++11那会儿,我就已经考虑将一个包含有unique timer模型的库中函数指针替换成std::function了,当时就苦恼std::function要如何比较,满世界的论坛,博客找了个遍,也没有答案,最终我只能去二进制层面寻求方法。
最初的时候,我一直在用一段代码来处理这个问题:
template<typename _Ty>
bool is_std_func_equal(_Ty& a, _Ty& b) {
struct __std_func_struct {
size_t* vt;
void* func_ptr;
};
__std_func_struct* pa = (__std_func_struct*)&a;
__std_func_struct* pb = (__std_func_struct*)&b;
if (pa->func_ptr == pb->func_ptr) {
return (pa->vt[2] == pb->vt[2]);
}
return false;
}
// 请注意,这段代码有bug
在VC++中,可以使用这个结构来模拟std::function的二进制数据:
struct __std_func_struct {
size_t* vt; // 虚函数表
void* func_ptr; // 函数指针
};
虚函数表中储存的函数地址:
vt[0] 与 vt[1] 相等,这两个虚函数不重要,不需要我们关注。
vt[2] 中保存了