c++ - 跨不同 dll 的 typeid 结果

标签 c++ dll templates typeid

我有两个 dll,它们都声明了一个模板化类型,让我们调用 A. 如果 A 的声明足够复杂,则碰巧 在两个不同的函数中调用 typeid(A).name() 的结果是不同的 dll 的。

例子:

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();
    }

例如 name1 可能是这样的:“???MyType???等” 而 name2 可能是“???A??TEMPLATE_LIST_OF_A 等”。

这对我来说实际上很有意义,但是有没有办法,只要 使用的名称相同以保证 name1==name2 ?

谢谢, 抢劫

最佳答案

不仅没有办法保证 typeid().name() 在不同的 DLL 中是相同的,标准几乎不保证返回的字符串。具体来说,它不能保证 a) 有意义,b) 对不同类型是唯一的,c) 对于相同类型是相同的。

作为实现质量问题,您可能会假设这三个条件成立,但特别是对于复杂的模板类型,如果您发现在特定编译器中违反它们的情况,我不会感到惊讶。

98标准的相关部分是5.2.8和18.5.1

关于c++ - 跨不同 dll 的 typeid 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118039/

相关文章:

c++ - 当我可以将对象的实际类型指定为模板参数时内联虚函数

c++ - 模板重载 = 运算符在一个类中工作而在另一个类中编译失败?

c++ - boost::optional 改变了一个隐式函数

c++ - 两个 dll 导出相同的函数,调用哪个?

c++ - 如何从 dll 正确返回 std::list

delphi - Delphi 中 DLL 的隐式链接与显式链接

c++ - 如何强制模板类型的常量性?

c++ - 具有相同名称的不同功能模板之间的重载优先级

c++ - 使用模板的模板特化

c++ - 什么是应用足迹以及如何计算它?