如何散列和比较指向成员函数?

我怎样才能哈希(std :: tr1 ::哈希或boost ::哈希)一个c + +指针成员函数?

例:

我有几个bool(Class :: * functionPointer)()(非静态)指向类的几个不同的方法,我需要哈希那些指向成员函数。

我怎样才能做到这一点?

也如何比较(std :: less)这些成员函数指针,所以我可以将它们存储在一个std :: set?

所有C ++对象(包括指向成员函数的指针)在内存中都以字符数组的forms表示。 所以你可以尝试:

bool (Class::*fn_ptr)() = &Class::whatever; const char *ptrptr = static_cast<const char*>(static_cast<const void*>(&fn_ptr)); 

现在,将ptrptr当作指向(sizeof(bool (Class::*)()))字节的数组,并散列或比较这些字节。 如果您愿意,可以使用unsigned char而不是char

这保证不会有误报 – 在C ++ 03中,指向成员函数的指针是POD,这意味着可以使用memcpy来复制它们。 这意味着如果具有相同的逐字节值,则它们是相同的。

问题是成员函数指针的存储表示可能包含不参与值的位 – 所以对于指向同一成员函数的不同指针,它们不一定是相同的。 或者编译器出于某种不明的原因,可能有不止一种方法指向同一个类的相同的function,而这些function在字节上是不相等的。 无论哪种方式,你可以得到错误的否定。 您将不得不查看成员函数指针如何在您的实现上实际工作。 它必须以某种方式为成员函数指针实现operator== ,如果你能find如何可以找出一个订单和一个哈希函数。

这可能是困难的:成员函数指针是尴尬的,存储可能包括不同数量的非参与“松弛空间”根据什么样的函数指向(虚拟,inheritance)。 所以你可能必须与编译器的实现细节进行非常重要的交互。 这篇文章可能会帮助你开始: http : //www.codeproject.com/KB/cpp/FastDelegate.aspx

一个更清洁的替代scheme可能是通过数组进行线性search,以便“规范化”所有函数指针,然后根据数组中该函数指针的“规范”实例的位置进行比较和散列。 取决于你的性能要求。 即使有要求,类(及其派生类)是否具有如此多的function以致于线性search需要很长时间?

 typedef bool (Class::*func)(); vector<func> canon; size_t getIndexOf(func fn_ptr) { vector<func>::iterator it = find(canon.begin(), canon.end(), fn_ptr); if (it != canon.end()) return it - canon.begin(); canon.push_back(func); return canon.size() - 1; } 

我无法像之前的回答中所描述的那样使用指针(在Microsoft编译器2010中),但是这适用于我:

 static string fmptostr(int atype::*opt) { char buf[sizeof(opt)]; memcpy(&buf,&opt,sizeof(opt)); return string(buf,sizeof(opt)); } 

关于指针的按位标识,它可以是按位,所以似乎使用了合适的编译器开关。 至less对于微软编译器来说这是真的,例如使用#pragma pointers_to_members和switch … / vmg