我正在使用哈希表(Google Inc的源代码)来存储一些定义为的方法指针:
typedef Object *(Executor::*expression_delegate_t)( vframe_t *, Node * );
显然“执行者”就是这个类。
向哈希表插入一些值的函数原型是:
hash_item_t *ht_insert( hash_table_t *ht, ulong key, ulong data );
所以基本上我正在插入双重方法指针:
ht_insert( table, ASSIGN, reinterpret_cast<ulong>( (void *)&Executor::onAssign ) );
其中table
在Executor类的声明中定义为“hash_table_t *
”,ASSIGN
是无符号长值,“onAssign
”是方法我必须映射。
现在,Executor::onAssign
存储为unsigned long值,我认为它在内存中的地址,我需要将ulong转发给方法指针。但是这段代码:
hash_item_t* item = ht_find( table, ASSIGN );
expression_delegate_t delegate = reinterpret_cast < expression_delegate_t > (item->data);
给我以下编译错误:
src/executor.cpp:45: error: invalid cast from type ‘ulong’ to type ‘Object* (Executor::*)(vframe_t*, Node*)’
我在x86 GNU / Linux机器上使用GCC v4.4.3。
任何提示?
答案 0 :(得分:3)
如果我没记错的话,由于实现细节,类方法指针可能比普通函数指针大。这可以解释为什么编译器不允许这种强制转换 - 方法指针不适合“普通”指针的存储空间。
正如我在上面的评论中所述,解决方案是使用适当的C ++哈希表实现,它允许通过C ++模板实现任意类型。