我想要一个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
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Whencantypeidreturndifferenttype_infoinstancesforsametype?如果我将下面的operand->type()==typeid(ValueType)行更改为&operand->type()==&typeid(ValueType),则代码仍然适用于gcc,并且在可执行文件中占用的空间更少(并且多年来一直如此),但是C++11标准是否提供任何保证,这种优化应该适用于不同的编译器?templateValueType*any_cast(any*operand){ret
我发现dynamic_cast在我预期的情况下没有工作,并查看typeid运行时的对象使情况变得更加不清楚。我只想要从基础到派生的转换,但我不明白为什么它不起作用。我有一个类似这样的类结构:classBoundaryCondition{public:virtualvoidDoSomething()=0;virtual~BoundaryCondition(){/***/}}classReflectingBc:BoundaryCondition{public:virtualvoidDoSomething();}classMarshakBc:BoundaryCondition{public:
为什么下面的例子:#include#includetemplatevoidfun(constT¶m){std::cout给出以下输出:Tisiparamisi1我知道type_info::name()行为依赖于实现。无论如何,我希望operator==返回false(因为param是一个const引用,而不是一个整数)。 最佳答案 这是在标准中定义的:5.2.8/5:Ifthetypeoftheexpressionortype-idisacv-qualifiedtype,theresultofthetypeidexpress
http://en.wikipedia.org/wiki/Typeid这对我来说似乎是个谜:编译器如何存储有关对象类型的信息?基本上,一个空类一旦实例化,内存中的大小就不会为零。 最佳答案 它的存储方式是实现定义的。有许多完全不同的方法可以做到这一点。但是,对于非多态类型,没有需要存储。对于非多态类型,typeid返回有关表达式的static类型的信息,即它的编译时类型。该类型在编译时始终已知,因此无需将任何其他信息与特定对象相关联(就像要使sizeof正常工作一样,您实际上不需要在任何地方存储对象大小)。您在问题中提到的“一个空对
我无法正确获取typeid函数。我错过了什么吗代码:classA{public:inta1;A(){}};classB:publicA{public:intb1;B(){}};intmain(){Btempb;Atempa;A*ptempa;ptempa=&tempb;std::cout它总是打印:乙级A类A类我正在为我的项目使用VS2010 最佳答案 问题是A没有虚函数,因此不被视为多态类型。因此,typeid查找指针的声明类型,而不是它指向的对象的实际类型。 关于c++-Typeid
当我尝试编译我的项目时,我得到了这个“不能将typeid与-fno-rtti一起使用”,我使用的是opencv框架。我用谷歌搜索了这个问题,但似乎我在互联网上发现的错误与我的问题无关。我不知道问题是否与包含、代码或编译器有关。Xcode多次给我错误,但第一个错误在这里:virtualconststd::type_info&type(){returntypeid(T);} 最佳答案 它在消息中告诉您错误:如果您在编译器上使用no-rtti标志,则typeid将不可用。只需启用RTTI;毕竟它是C++的一部分。
我使用typeid获取std::vector::size_type的类型名称和一个零大小的类A,代码如下(cppreference):#include#include#includeusingnamespacestd;classA{};intmain(){vectorv(10);vector::size_types=v.size();Aa;cout我把这个作为输出:m1A我猜“A”之前的“1”是空基类优化的结果,但是“m”代表什么,这正常吗?我正在使用以下gcc版本:g++(Ubuntu4.4.3-4ubuntu5.1)4.4.3 最佳答案
也许我误解了继承在这里的工作方式,但这是我的问题:我有一个类Option和一个派生自它的类RoomOption。我有另一个类(class)房间,里面有一个shared_ptrvector。在main中,我向该vector添加了一个RoomOption。然后,使用typeid()我检查类型,它告诉我它是一个选项。根据我的阅读,typeid应该返回派生类型,而shared_ptrs不会导致切片,所以我不确定我做错了什么。代码如下:房间.h:vector>options;voidaddOption(shared_ptr);shared_ptrgetOption(int);房间.cpp:voi