【问题标题】:C++ ulong to class method pointer and backC ++ ulong到类方法指针并返回
【发布时间】:2010-03-29 15:25:30
【问题描述】:

我正在使用哈希表(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 存储为一个无符号长整型值,我认为它在内存中的地址,我需要将 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。

有什么提示吗?

【问题讨论】:

  • 你为什么使用无类型的 C 哈希表实现而不是正确类型的 C++ 类?

标签: c++ c casting


【解决方案1】:

如果我没记错的话,类方法指针可能由于实现细节而比普通函数指针大。这可以解释为什么编译器不允许这种转换——方法指针不适合“普通”指针的存储空间。

正如我在上面的评论中所说,解决方案是使用适当的 C++ 哈希表实现,允许通过 C++ 模板进行任意类型。

【讨论】:

  • 我应该修改很多代码以使用模板哈希表类而不是 C 实现,使用这个有什么解决方案吗?
  • 您可以使用 STL 地图类或 tr1::unordered_map 来避免自己编写。
  • 我尝试了这些课程并相信我,我使用的库比他们快很多。我需要一个非常快速的密钥查找机制来处理这个项目。
  • PS: 无论如何,我现在会使用 std::map :)
  • @Simone:如果我没记错的话,Google 也有一个 C++ 集合库。不过现在找不到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多