问题标签 [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 投票
3 回答
1360 浏览

c++ - 是否有用于标准化类型名称字符串格式的 C++ type_info 的可移植包装器?

的输出格式type_info::name()是特定于实现的。

有没有人写过一个包装器,它返回可靠的、可预测的类型信息,这些信息在编译器中是相同的。多个模板化函数将允许用户获取有关类型的特定信息。所以我也许可以使用:

这些函数只是示例,对 C++ 类型系统有更好了解的人可能会设计出更好的 API。我感兴趣的那个base()。如果 RTTI 被禁用或检测到不支持的编译器,所有函数都会引发异常。

这似乎是 Boost 可能实现的那种东西,但我在任何地方都找不到它。是否有一个便携式库可以做到这一点?

0 投票
2 回答
554 浏览

c++ - 编译器如何评估 `typeid` 运算符?

这是我用来尝试解决这个问题的一些基于 CRTP 的模板代码: Requiring overridden virtual functions to call base implementations。我会在这里发布代码,但是这些行很长,并且在 codepad.org 上更容易阅读(如果需要,我会在这里发布)。当然,它很丑陋,而且有些人为,尽管它确实有效。但我一开始并没有意识到,虽然它可以在 MSVC++ 和 GCC 上编译,但某些模板类型并没有真正定义。我要质疑的部分是顶部函数中的几个长内部if( typeid( Derived(N) ) != typeid( Derived(N-1))(符号符号) 。TBase::OnEvent

你不能typdef使用这些类型,这将是一个编译错误 - 没有足够的派生类可以用这么长的...::TDerived::...链定义类型,所以你会正确地得到编译错误TDerived is not defined in TBase。然而编译器会吃掉它们typeid。当我检查调试器 MSVC++ 编译器输出(带有完整的符号信息)时,似乎所有那些...::TDerived::...不应该真正导致任何类的 long 都typeid被编译器解析为TDerived04类链中的最后一个。...::TDerived::...并且 RTTI 被拉到班级链中的最后一个班级,与我有多少无关。

考虑到 MSVC++ 和 GCC 都是这样做的(尽管我只能通过 codepad.org 访问 GCC),我的问题是下一个:它是否以某种方式定义了行为typeid?那么为什么typedef那些长的...::TDerived::...不解决TDerived04呢?

编辑:我的意思是,我很高兴typedef没有解决TDerived04,这对于任何使用 的人来说都是一场灾难,但为什么和typedef之间存在这种不一致呢?typeidtypedef

编辑:GCC 接受TDerived04::TDerived04::TDerived04::TDerived04 lD4;变量声明。而且类型简单TDerived04到底。是否有折叠范围解析的规则?显然,MSVC++ 和 GCC 似乎都在做同样的事情typeid,但是与 GCC 不同,MSVC++ 无法处理其他情况——它会产生编译错误,需要构造函数的参数。

0 投票
3 回答
1868 浏览

c++ - 在 C++ 中找出对象或变量的标识符名称和类型标识?

我开始学习 C++(一年前)主要是因为它是 IMO 通用语言,因为几乎一切皆有可能。但有一件事并非如此:例如,我们正在一个对象(类)中编写一些代码,我们需要以某种方式找出它的名称:

最好的选择是使用“this”关键字,但这无济于事,因为“this”不能返回名称?

我们如何在一些通用函数甚至模板中获取“thatsMyName”字符串?

另一个例子:(也请回答这个问题)

我们如何获得某个类的 typeid?

这看起来很有趣,但如果你们中的任何人对如何完成类似任务有一些想法......

多谢。

编辑:好的,每个人都说不可能获得对象的名称,我发现了如何获得名称:

编辑:非常感谢 Fiktik 回答我的第二个示例,他找到了如何获取对象的 type_info 的方法!

0 投票
1 回答
1168 浏览

c# - 两个语义相同的属性的 TypeId 应该不同还是相同?

MSDN 声明该属性TypeId

正如所实现的那样,这个标识符仅仅是属性的类型。但是,唯一标识符旨在用于标识相同类型的两个属性。

然而,预期用途是区分单个属性实例(例如,与应用它们的类的不同实例相关联的实例)还是区分具有相同类型但由于其属性值在语义上不同的属性?

例如,假设我有以下内容:

我应该将 TypeId 实现为

或者

0 投票
2 回答
3108 浏览

c++ - 为什么 typeid 返回 int 和 const int 是相同的类型

节目输出:

相同类型

我错过了什么吗?这些不是相同的类型,哈哈。

0 投票
3 回答
2690 浏览

c++ - typeid 和 type_info 类

在 type_info 类的声明中,我找不到任何数据成员。那么构造或破坏了什么?typeid 也没有在其中声明。那么它是如何访问 type_info 对象的呢?
上面的表示不完整吗?请讲讲类中数据成员的type_info类型

0 投票
3 回答
7707 浏览

c++ - 为什么使用 typeid 关键字设计不好?

我听很多人说任何使用typeid都是糟糕的设计,但对我来说,它似乎提供了很好的实用性。

  1. 何时(以及为什么)使用typeid“糟糕的设计”?
  2. 什么时候typeid可以接受使用?
  3. 当它不可接受,但您仍然需要类似的东西时,有什么替代方案会具有良好的设计?
0 投票
4 回答
49290 浏览

c++ - gdb:显示一些数据的类型信息

基本上,我想得到typeid(*this).name(),即this.

我想在 GDB 中得到这个(不修改源代码)。我试过print typeid(*this)了,但它说这typeid是未知的(因为我没有将它包含在源文件中)。

0 投票
3 回答
182 浏览

c++ - 模板功能搞砸了

所以我的 ResourceManager 类对于我正在使用 c++ 进行的游戏有一些问题。所以我试图从我的常规 addImage 函数中创建一个模板函数,这样它也会添加声音,但是我遇到了一些我无法真正处理的错误,你们能帮帮我吗?:D

.hpp

.cpp

错误@_@

0 投票
1 回答
129 浏览

c++ - 在由同一编译器编译的另一个进程提供的指针上使用 typeid 是否安全?

根据标准,typeid 操作符是依赖于实现的,所以在不同编译器编译的其他进程创建的对象上使用它是无稽之谈。但是提供进程由同一个编译器编译是什么情况呢?