2010-06-25 68 views
3

我有兩個dll都聲明模板類型,我們稱之爲A. 如果A的聲明足夠複雜,則發生typeid(A).name()的結果是 是不同的當在函數中調用兩個不同的 dll時。不同dll的typeid結果

例如:

DLL1:

struct MyType: public A<TEMPLATE_LIST_OF_A>{} 

void f(){ 
std::string name1 = typeid(A).name(); 
} 

DLL2:

struct MyType: public A<TEMPLATE_LIST_OF_A>{} 
    void f(){ 
    std::string name2 = typeid(A).name(); 
    } 

例如姓名1可能是這樣的: 「??? ???的MyType等」 而NAME2可能是「??? A TEMPLATE_LIST_OF_A等」。

這實際上對我來說很有意義,但是有一種方法,前提是所用的名稱是 以保證name1 == name2?

感謝, 搶

回答

3

不僅沒有辦法保證typeid().name()在不同的DLL中是相同的,這個標準幾乎不能保證返回的字符串。具體來說,它不能保證是有意義的,b)對於不同類型是唯一的,c)對於相同類型是相同的。

作爲實現問題的質量,您可以假設這三個條件成立,但對於複雜的模板類型尤其如此,如果您能找到在特定編譯器中被違反的情況,我不會感到驚訝。

98標準的相關部分是5.2.8和18.5.1

+0

謝謝你,這只是我害怕的最壞情況! – rob 2010-06-25 15:30:37

0

不,其實有不同類型的(在我看來)。

另外typeid()。name()是編譯器特定的。

0

如果這兩個DLL編譯時與完全相同的操作系統,編譯器和編譯器選項似乎可能是相同的typeids。