有没有办法获得编译时间typeid来自禁用RTTI的GCC的信息?在VisualStudio下,像constchar*typeName=typeid(int).name();这样的简单命令将适本地返回“int”,即使RTTI被禁用。不幸的是,GCC不能这样做。当我尝试调用typeid没有RTTI,我的程序会崩溃。我知道禁用RTTI不是标准的一部分,但无论如何我可以强制GCC对已知类型进行编译时解析吗?出于性能原因,RTTI被禁用。我不需要运行时RTTI。编辑:这就是我最终的结果:templateconstchar*TypeName(void);templateconstchar*Typ
有没有办法获得编译时间typeid来自禁用RTTI的GCC的信息?在VisualStudio下,像constchar*typeName=typeid(int).name();这样的简单命令将适本地返回“int”,即使RTTI被禁用。不幸的是,GCC不能这样做。当我尝试调用typeid没有RTTI,我的程序会崩溃。我知道禁用RTTI不是标准的一部分,但无论如何我可以强制GCC对已知类型进行编译时解析吗?出于性能原因,RTTI被禁用。我不需要运行时RTTI。编辑:这就是我最终的结果:templateconstchar*TypeName(void);templateconstchar*Typ
使用C++(gcc4.8.3)我有2种类型(T1和T2),它们具有typeid(T1).name()的奇怪属性和typeid(T2).name()是一样的,但是std::is_same::value是false.怎么可能?我如何进一步调查以确定原因可能是什么? 最佳答案 忽略多态性,typeid()为您提供了一个表示表达式静态类型的对象。但是当涉及到表达式类型时,有些元素会被忽略。来自[expr]:Ifanexpressioninitiallyhasthetype“referencetoT”(8.3.2,8.5.3),thetype
使用C++(gcc4.8.3)我有2种类型(T1和T2),它们具有typeid(T1).name()的奇怪属性和typeid(T2).name()是一样的,但是std::is_same::value是false.怎么可能?我如何进一步调查以确定原因可能是什么? 最佳答案 忽略多态性,typeid()为您提供了一个表示表达式静态类型的对象。但是当涉及到表达式类型时,有些元素会被忽略。来自[expr]:Ifanexpressioninitiallyhasthetype“referencetoT”(8.3.2,8.5.3),thetype
如果有的话,有什么C++构造用于在运行时列出类的祖先?基本上,我有一个类,它存储指向任何对象的指针,可能包括原始类型(有点像boost::any,我不想使用它,因为我需要保留对象的所有权)。在内部,这个指针是void*,但是这个类的目标是包装void*具有运行时类型安全性。赋值运算符是模板化的,所以在赋值时我取typeid()传入指针并存储它。然后当我稍后回退时,我可以检查typeid()针对存储的type_info的强制转换类型.如果不匹配,强制转换将抛出异常。但是有一个问题:我似乎失去了多态性。假设B是D的基数.如果我存储指向D的指针在我的类里面,然后存储type_info也将是D
如果有的话,有什么C++构造用于在运行时列出类的祖先?基本上,我有一个类,它存储指向任何对象的指针,可能包括原始类型(有点像boost::any,我不想使用它,因为我需要保留对象的所有权)。在内部,这个指针是void*,但是这个类的目标是包装void*具有运行时类型安全性。赋值运算符是模板化的,所以在赋值时我取typeid()传入指针并存储它。然后当我稍后回退时,我可以检查typeid()针对存储的type_info的强制转换类型.如果不匹配,强制转换将抛出异常。但是有一个问题:我似乎失去了多态性。假设B是D的基数.如果我存储指向D的指针在我的类里面,然后存储type_info也将是D
我知道编译器在实现std::type_info函数的行为方面有很大的自由度。我正在考虑使用它来比较对象类型,所以我想确定:std::type_info::name必须为两种不同的类型返回两个不同的字符串。std::type_info::before必须说Type1是beforeType2exclusive-orType2是beforeType1。//likethis:typeid(T1).before(typeid(T2))!=typeid(T2).before(typeid(T1))同一模板类的两种不同的特化被认为是不同的类型。同一类型的两个不同的typedef-initions是同
我知道编译器在实现std::type_info函数的行为方面有很大的自由度。我正在考虑使用它来比较对象类型,所以我想确定:std::type_info::name必须为两种不同的类型返回两个不同的字符串。std::type_info::before必须说Type1是beforeType2exclusive-orType2是beforeType1。//likethis:typeid(T1).before(typeid(T2))!=typeid(T2).before(typeid(T1))同一模板类的两种不同的特化被认为是不同的类型。同一类型的两个不同的typedef-initions是同
我想要一个constexpr函数,它将为每个C++类型返回一个唯一的id,如下所示:usingtypeid_t=uintptr_t;templateconstexprtypeid_ttype_id()noexcept{returntypeid_t(type_id);}intmain(){::std::cout()>{}但是我得到一个错误:t.cpp:Infunction'intmain()':t.cpp:23:69:error:conversionfrompointertype'typeid_t(*)()noexcept{akalongunsignedint(*)()noexcept}
我有以下代码intmain(){cout>name;cout根据我读过的关于typeid运算符的各种教科书和文档,我应该会读到"Datatype=string"作为输出。相反,我得到以下信息classstd::basic_string,classstd::allocator>有人知道我哪里出错了吗?FWIW,我使用的是VisualStudio2010Professional。 最佳答案 没有错。那些教科书首先应该告诉你name()的结果是实现定义的,很可能是""。其次,该类型是std::string。std::string类型只是s