jjzjj

C++:在生产代码中使用 typeid

在生产代码中使用typeid通常被认为是不好的做法吗?此外,我注意到typeid返回type_info,其中包括一些元数据(例如带有类型名称的字符串);有没有办法停用这个? 最佳答案 取决于您使用typeid做什么。如果您在应该使用多态性的地方使用,那当然很糟糕。但是,将痕迹或类似的东西转储到客户的机器上进行调试就可以了。唯一的方法是在你的编译器上禁用RTTI。没有标准的方法可以做到这一点。请注意,这也会禁用dynamic_cast。 关于C++:在生产代码中使用typeid,我们在St

c++ - 使用 typeid 获取派生类的名称

我正在创建一个资源管理器,它接受从类Resource派生的类。我的问题是typeid(..).name()返回错误的类名。我想像这样将纹理等资源添加到map中:typedefstd::unordered_mapResourceMap;我希望“类+计数器”的名称是资源的字符串/名称。不幸的是,所有东西最终都被称为P8Resource,因为这些类派生自“Resource”。确实是一个不合时宜的困境,但typeid必须以某种方式知道texture是一个纹理,而不是资源。classResource{};//abstractclassTexture:publicResource{};Resour

c++ - typeid 中没有调用函数吗?

函数不是在typeid内部调用的吗?考虑下面的代码。#include#includeusingnamespacestd;intmul10(int&s){staticintcount=1;cout所以这里的输出是int5很明显i的值没有改变,函数mul10也没有被实际调用。这是typeid参数的评估方式吗? 最佳答案 typeid的操作数只有在它是多态类类型的左值时才会被求值。由于mul10的返回类型,即int,不是多态类类型,操作数不被计算,意味着mul10没有被调用. 关于c++-ty

c++ - 多态类型的 typeid

我希望这段代码打印“Same1”和“Same2”,但它只打印“Same1”:#include#includeusingnamespacestd;structC{virtual~C(){}};structD:C{};intmain(){Dd;Cc,&cr1=d;if(typeid(cr1)==typeid(D))cout§5.2.8/2和§5.3.1/3似乎都建议我应该打印“Same2”。有什么收获? 最佳答案 指针不是多态类型。他们没有虚拟成员。事实上,他们没有任何成员。它们也不能从其他类型派生,也不能用作基类。因此,T*的静态和动

c++ - typeid 何时可以为同一类型返回不同的 type_info 实例?

AndreiAlexandrescu写入ModernC++Design:Theobjectsreturnedbytypeidhavestaticstorage,soyoudon'thavetoworryaboutlifetimeissues.安德烈继续说道:Thestandarddoesnotguaranteethateachinvocationof,say,typeid(int)returnsareferencetothesametype_infoobject.尽管标准不保证这一点,但在GCC和VisualStudio等常见编译器中如何实现这一点?假设typeid没有泄漏(并且每次调

c++ - 是否在前向声明的类型未定义行为上使用 typeid?

我是否正确阅读了5.2.8.3中的标准:...如果expression是一个类类型,该类应该是完全定义的。如果类型不是“完全定义的”,是否意味着下面的程序是未定义的?foo.cpp:structfoo{virtualvoida(){}};structbar:foo{virtualvoida(){}};barabar;foo&get_some_foo(){returnabar;}主要.cpp:#include#includestructfoo;foo&get_some_foo();intmain(){foo&a_ref_foo(get_some_foo());std::coutMSVC1

c++ - 为什么使用 typeid 关键字是糟糕的设计?

我听很多人说typeid的任何用法都是糟糕的设计,但对我来说它似乎提供了很好的实用性。什么时候(以及为什么)typeid的使用是“糟糕的设计”?什么时候可以接受typeid的使用?当它NotAcceptable,但你仍然需要类似的东西时,怎么办?有好的设计的替代方案吗? 最佳答案 问题不在于typeid。问题是看到typeid会鼓励你这样写:PolymorphicType*pType=...;if(typeid(*pType)==typeid(Derived1))pType->Func1();elseif(typeid(*pType

c++ - 通过 typeid 的类的数字唯一标识符

C++中的typeid运算符返回一个std::type_info类的对象,该对象可以产生其文本名称。但是,我只是对获取任何多态类的唯一数字标识符感兴趣。(在单个程序运行范围内是唯一的-不一定在运行之间)实际上,我可以只取消引用指针并读取vptr的内容——但这既不优雅也不可移植。我更喜欢便携的方式。我能否以某种方式使用typeid运算符为一个类设置一个“安全”的数字标识符?例如,对于给定类的每个typeid调用,我可以指望生成的std::type_info结构的地址相同吗?或者可能是name()指针本身? 最佳答案 std::type

c++ - 为什么在使用 typeid 运算符时需要#include <typeinfo>?

typeid表示C++RTTI运算符也是C++关键字。它返回一个std::type_info保存(动态)类型特定信息的对象。根据我从各种来源了解到的情况,其中一个必须包含使用typeid时,否则程序格式错误。事实上,如果我不包含前面提到的头文件,我的gcc5.2编译器甚至不会编译程序。我不明白为什么使用C++keyword时必须包含header。我理解每当我们使用在该header中声明/定义的某些对象时都需要一个header,但是typeid不是类类型。那么,强制包含header的原因是什么?? 最佳答案 下一段:Thetypeid

c++ - typeid 不适用于非静态成员函数

clang不会编译下面对typeid的第三次调用(请参阅liveexample)。但是我在§5.2.8中看不到任何不允许这样做的内容,特别是当我们认为表达式B::f不是多态类类型的泛左值时(参见第3段)。此外,根据本段,表达式B::f是未计算的操作数,因此,调用typeid(B::f)应该编译。请注意,GCC不会编译以下对typeid的任何调用:#include#includestructA{inti;};structB{inti;voidf();};intmain(){std::cout 最佳答案 据我所知clang是正确的,如果