2010-03-16 49 views
1

我有一個模板,它爲每個類型創建一個唯一的標識符。這裏有一個精簡版的模板:基於類型創建唯一標識是否有一個很好的模式?

template <typename T> 
class arType { 
    static const arType Id; // this will be unique for every instantiation of arType<>. 
} 

// Address of Id is used for identification. 
#define PA_TYPE_TAG(T) (&arType<T >::Id) 

這個工作原理是當你的可執行文件完全由靜態庫構成時。不幸的是,我們正在轉向由dll組成的可執行文件。每個DLL可能有一個類型的Id自己的副本。

一個明顯的解決方案是顯式實例化arType的所有實例。不幸的是,這很麻煩,我想問問有沒有人可以提出更好的解決方案?

+1

你可以看看http://stackoverflow.com/questions/1708458/template-metaprogram-converting-type-to-unique-number – 2010-03-16 20:50:38

+0

一個明顯的問題是「爲什麼你認爲你需要這樣做?「 – 2010-03-16 21:06:43

+0

我希望能夠在運行時存儲唯一標識符並將其用於比較。我們使用它的一個地方是類型之間的轉換表。 – 2010-03-16 21:34:27

回答

1

返回一個std :: TYPE_INFO對象從每個物體上的功能和使用==操作符的結果。您可以使用返回排序順序的before()函數對它們排序。

它是專門設計來做你想做的。如果你想隱藏它在底下的工作方式,你可以用一個運營商<以不透明的「id」類型包裝它。

http://www.cplusplus.com/reference/std/typeinfo/type_info/

+0

這就是我最終做的,似乎是做這項工作。沒有指針檢查那麼快,但是哦... – 2010-03-22 17:43:42

0

是的,這是簡單的比你想:

template<...> class withAnID { 
    static void idFunction(){}; 
} 

用法:(!排序)

&withAnID<...>::idFunction; 

由於模板的每個實例都有它自己的組件,每個功能都有一個唯一的地址,你可以用它來識別它們。

+2

在DLL的?我不這麼認爲。這與OP的解決方案沒有什麼不同。 – GManNickG 2010-03-16 21:51:10

+0

感謝Narfanator,但是GMan是正確的。我正在尋找解決方案,跨越DLL的作品。 – 2010-03-16 22:04:31

0

嗯,我認爲唯一的辦法就是進行編程考慮到該DLL問題:)

我的意思的方法處理的ID,如果你能計算全局類型ID爲「DLL ID」 +「DLL本地類型ID「你有你想要的。我認爲這可能是可行的,如果你管理DLL加載部分或如果操作系統給你回調來管理。如果你可以在DLL綁定對象中設置一個唯一的ID,你就完成了;-)

我不是Windows DLL管理專家,但我記得有一些像「on_dll_load」回調的事情,可能會做的伎倆。任何DLL管理專家?

只是我的2美分...

相關問題