2010-03-29 368 views
1

我使用哈希表(由谷歌公司的源代碼),用於存儲被定義爲一些方法指針:C++ ULONG類方法指針和背面

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。

任何提示?

+2

爲什麼使用非類型化的C哈希表實現而不是正確類型的C++類? – 2010-03-29 15:34:12

回答

3

如果沒有記錯,一個類方法指針可能由於實現細節是比正常函數指針大。這可以解釋爲什麼編譯器不允許這種轉換 - 方法指針不適合「正常」指針的存儲空間。

正如我在上面的評論中所述,解決方案是使用適當的C++哈希表實現,該實現允許通過C++模板實現任意類型。

+0

我應該修改很多代碼來使用模板哈希表類而不是C實現,使用這個的任何解決方案? – 2010-03-29 15:39:38

+0

您可以使用STL映射類或tr1 :: unordered_map來避免編寫自己的。 – Joel 2010-03-29 15:45:54

+0

我試過這些課,相信我,我使用的圖書館比其他圖書館快得多。 我需要一個非常快速的鍵盤查找機制,用於這個項目。 – 2010-03-29 15:49:04