我怎样才能散列(标准:: TR1 ::散列或升压::散列)一个C ++指针到成员函数?
例:
我有几个布尔(类:: * functionPointer)()(而不是静态),其指向Class类的几种方法diferent,我需要这些散列指针到成员函数。
我怎样才能做到这一点?
此外,我怎么能比较(STD ::以下)的成员函数指针,所以我可以存储他们一个std ::设置?
我怎样才能散列(标准:: TR1 ::散列或升压::散列)一个C ++指针到成员函数?
例:
我有几个布尔(类:: * functionPointer)()(而不是静态),其指向Class类的几种方法diferent,我需要这些散列指针到成员函数。
我怎样才能做到这一点?
此外,我怎么能比较(STD ::以下)的成员函数指针,所以我可以存储他们一个std ::设置?
所有的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;
}
我不能投的指针(在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