问题标签 [typeid]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2087 浏览

c++ - 在 `typeid` 代码中奇怪地使用`?:`

在我正在进行的一个项目中,我看到了这段代码

我从未见过typeid这样使用过。为什么它会跳那种奇怪的舞蹈?:,而不仅仅是做typeid(*m_basePtr)?有什么理由吗?Base是一个多态类(带有虚拟析构函数)。

编辑:在这段代码的另一个地方,我看到了这个,它似乎是“多余的”

0 投票
5 回答
2152 浏览

c++ - 使用 RTTI 确定 C++ 中的继承图?

如果有的话,有什么 C++ 结构可以在运行时列出类的祖先?

基本上,我有一个类,它存储指向任何对象的指针,可能包括原始类型(有点像boost::any,我不想使用它,因为我需要保留对象的所有权)。在内部,这个指针是 a void*,但这个类的目标是void*用运行时类型安全包装 。赋值运算符是模板化的,所以在赋值时我获取typeid()传入指针的 并存储它。然后当我稍后再转换时,我可以检查typeid()转换类型与存储的type_info. 如果不匹配,强制转换将引发异常。

但是有一个问题:似乎我失去了多态性。假设BD. 如果我在我的类中存储一个指针D,那么存储的type_info也将是D. 然后稍后,我可能想要检索一个B指针。如果我使用我的类的方法强制转换为B*,那么会typeid(B) == typeid(D)失败,并且强制转换会引发异常,即使D->B转换是安全的。Dynamic_cast<>()不适用于这里,因为我在 avoid*而不是 or 的祖先上B操作D

我想做的是检查is_ancestor(typeid(B), typeid(D))这可能吗?(这不是dynamic_cast<>在幕后做的吗?)

如果没有,那么无论如何我都在考虑采用第二种方法:实现 aa class TypeInfo,其派生类是模板化的单例。然后我可以在这些类中存储我喜欢的任何信息,然后在我的类中保留指向它们的指针AnyPointer。这将允许我在编译时以更易于访问的方式生成/存储祖先信息。所以失败的选项#1(一种列出祖先的内置方式,只给出运行时可用的信息),是否有我可以使用的构造/过程,它允许在编译时自动生成和存储祖先信息,最好没有必须明确输入“类A派生自BCC派生自D“等等?一旦我有了这个,有没有一种安全的方式来实际执行那个演员?

0 投票
2 回答
975 浏览

c++ - type_info 指针可以用于区分 C++ 中的类型吗?

我有一组多态 C++ 类,它们都由同一个模块(Windows DLL)实例化。现在有两个指向此类类的指针并调用了typeid

我可以比较检索到的type_info地址吗

或使用==

检测对象是(完全)同一类还是不同类?当对象从同一个模块中实例化时,它是否保证工作?

0 投票
3 回答
765 浏览

c++ - typeid 运算符返回的对象的生命周期是多少?

如果我调用typeid并检索返回的地址type_info

返回的对象的生命周期是typeid多少,指向该对象的指针将保持有效多长时间?

0 投票
1 回答
287 浏览

c++ - 相等的 type_info 地址是否意味着相等的类型?

我正在对用于识别对象类型的代码进行微优化。我假设我可以使用以下内容来检查在同一模块中实例化的两个对象是否具有相同的类型:

逻辑是,一旦type_info返回引用,该引用后面的对象就可以保证在模块被卸载之前一直存在。因此,一旦返回引用,就没有其他对象可以占用相同的地址。

因此,如果地址匹配,则它们是相同的type_info对象和相同的数据类型。如果实现返回type_info相同类型的不同对象,type_info::operator==则调用并执行附加检查。

这是一个正确的假设吗?

0 投票
5 回答
23383 浏览

recursion - 递归可变参数模板打印出参数包的内容

如何创建一个递归可变参数模板来打印出参数包的内容?我正在尝试这个,但它无法编译:

我该如何结束递归?

0 投票
1 回答
196 浏览

scala - C++ typeid 的 Scala 等价物是什么?

例如,如果我这样做

在 REPL 中,我想查看最精致的“a”类型,以便知道它是否真的是一个 HashSet。在 C++ 中, typeid(a).name() 会这样做。Scala 等价物是什么?

0 投票
1 回答
3087 浏览

c++ - 编译时的 C++ 类型 ID

我想在编译时根据其派生类型为类生成哈希。今天我像这样生成它:

但这会生成(非常不必要的)运行时初始化代码( hash(..) 函数基于 std::type_info::name() 进行简单的哈希)

想法?

0 投票
4 回答
2008 浏览

c++ - 使用 typeinfo::name() 后内存泄漏

我有一个程序,在该程序中,部分用于信息日志记录,我在使用某些类时输出它们的名称(特别是我在日志中添加了一个条目,如Messages::CSomeClass transmitted to 127.0.0.1)。我使用类似于以下的代码执行此操作:

是的,在任何人指出之前,我意识到输出typeinfo::name是特定于实现的。

根据MSDN

type_info::name成员函数返回一个以 null 结尾的字符串,表示该const char*类型的人类可读名称。指向的内存是缓存的,永远不应该直接释放。

但是,当我在调试器中退出程序时,任何“新”使用都会typeinfo::name()显示为内存泄漏。如果我输出 2 个类的信息,我会得到 2 个内存泄漏,依此类推。这暗示缓存的数据永远不会被释放。

虽然这不是一个主要问题,但它看起来很混乱,并且经过长时间的调试会话后,它很容易隐藏真正的内存泄漏。

我环顾四周,发现了一些有用的信息(一个 SO 答案提供了一些关于如何实现 typeinfo 的有趣信息),但我想知道这个内存是否应该由系统正常释放,或者是否有什么我可以做的调试时“不注意”泄漏。

我确实有一个后备计划,即getMessageName自己编写方法而不是依赖于typeinfo::name,但无论如何我想知道是否有我错过的东西。

0 投票
1 回答
2130 浏览

magento - 在magento中为不同的产品类型设置不同的布局?

我们如何根据产品类型为不同的产品设置不同的布局?我想以不同的布局显示虚拟和捆绑产品,简单和分组将以不同的布局显示。

谢谢