c – 如何散列和比较指向成员函数的指针?

c – 如何散列和比较指向成员函数的指针?,第1张

概述我如何散列(std :: tr1 :: hash或boost :: hash)一个c指针指向成员函数? 例: 我有几个bool(Class :: * functionPointer)()(不是静态的)指向类Class的几个不同的方法,我需要散列那些指向成员函数的指针. 我怎样才能做到这一点? 另外我如何比较(std :: less)那些成员函数指针,以便我可以将它们存储在std :: set中? 我如何散列(std :: tr1 :: hash或boost :: hash)一个c指针指向成员函数?

例:

我有几个bool(Class :: * functionPointer)()(不是静态的)指向类Class的几个不同的方法,我需要散列那些指向成员函数的指针.

我怎样才能做到这一点?

另外我如何比较(std :: less)那些成员函数指针,以便我可以将它们存储在std :: set中?

解决方法 所有C对象(包括指向成员函数的指针)在内存中表示为chars数组.所以你可以尝试:
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复制它们.这意味着如果具有相同的逐字节值,则它们是相同的.

问题是成员函数指针的存储表示可能包括不参与值的位 – 因此对于指向同一成员函数的不同指针它们不一定相同.或者,由于某些不明原因,编译器可能有多种方法指向同一个类的相同函数,这些函数在字节方面不相等.无论哪种方式,你都可以得到假阴性.您将不得不研究成员函数指针如何实际对您的实现起作用.它必须以某种方式为成员函数指针实现operator ==,如果你能找到如何,那么你可以找出一个顺序和一个哈希函数.

这可能很难:成员函数指针很笨拙,根据指向的函数类型(虚拟,继承),存储可能包含不同数量的非参与“松弛空间”.因此,您可能必须与编译器的实现细节进行非常重要的交互.本文可能有助于您入门:http://www.codeproject.com/KB/cpp/FastDelegate.aspx

更简洁的替代方法可能是通过数组进行线性搜索,以便“规范化”所有函数指针,然后根据数组中该函数指针的“规范”实例的位置进行比较和散列.取决于您的性能要求.即使有需求,类(及其派生类)是否具有如此多的函数,线性搜索将花费那么长时间?

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;}
总结

以上是内存溢出为你收集整理的c – 如何散列和比较指向成员函数的指针?全部内容,希望文章能够帮你解决c – 如何散列和比较指向成员函数的指针?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存