如何散列和比较指针到成员函数?(How to hash and compare a pointer-

2019-06-19 01:06发布

我怎样才能散列(标准:: TR1 ::散列或升压::散列)一个C ++指针到成员函数?

例:

我有几个布尔(类:: * functionPointer)()(而不是静态),其指向Class类的几种方法diferent,我需要这些散列指针到成员函数。

我怎样才能做到这一点?

此外,我怎么能比较(STD ::以下)的成员函数指针,所以我可以存储他们一个std ::设置?

Answer 1:

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

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

一个更清洁的替代可能是根据您的数组中的函数指针的“规范”实例的位置做通过阵列线性搜索,以“canonicalise”所有的函数指针,然后进行比较和散列。 取决于你的性能要求是什么。 而且,即使有需求,确实类(及其派生类)有许多功能,线性搜索将持续多长时间?

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


Answer 2:

我不能投的指针(在Microsoft编译器2010)在前面的回答说明,但这对我的作品:

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

关于指针的按位的身份,可以按位如此看来,如果使用适当的编译器开关。 至少,这使用#pragma pointers_to_members和开关是用于Microsoft编译器如真... / VMG



文章来源: How to hash and compare a pointer-to-member-function?