2010-06-25 66 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。