在C++03中,当您使用运算符typeid时,一个type_info返回对象。是否可以仅根据此结果检索给定类型的大小,例如由sizeof返回的运营商?例如:std::type_infoinfo=typeid(int);intintSize=sizeof(int);intintSize2=info.getSize();//doesn'texist!问题是我们使用第三方多数组类返回类型信息,但不返回类型的大小。 最佳答案 我能看到的最好方法(我想被证明是错误的)是预先注册类型,如下所示:#include#include#include#
如果我定义一个具有特定对齐要求的简单类型,该类型的std::vector难道不应该为每个元素遵守对齐吗?考虑下面的例子typedefstd::arrayalignas(32)avx_point;std::vectorx(10);assert(!(std::ptrdiff_t(&(x[0]))&31)&&//assertthatx[0]is32-bytealigned!(std::ptrdiff_t(&(x[1]))&31));//assertthatx[1]is32-bytealigned我发现clang3.2(带或不带-stdlib=libc++)悄悄地(没有任何警告)违反了对齐要求
我在C++中有一个模板类,它作为char_type模板参数字符类型,例如char,wchar_t,char32_t,等等...该类然后使用std::basic_string在代码中。然后在类里面的某个地方,我填写了一个转义序列表,例如"&".这不起作用,因为取决于模板字符类型,我们需要使用"&",L"&",U"&"...有没有办法避免专门用于初始化表的模板函数,例如使用一些标准函数来转换字符串文字?由于这些是转义序列,因此除了ASCII字符外,它们不包含任何其他字符。 最佳答案 我会做以下事情:tem
最近我设计了元类型和允许编译时类型连接的可能操作:#includetemplatetypenameT>structMetaTypeTag{};/*variabletemplatehelper*/templatetypenameT>constexprMetaTypeTagmeta_type_tag={};templatestructTypeTag{};/*comparison*/templateconstexprbooloperator==(TypeTag,TypeTag){returntrue;}templateconstexprbooloperator==(TypeTag,TypeT
我有以下情况:我的问题围绕使用强类型枚举类作为标志(就像在C#中使用Flags-Attribute一样)。我知道这不是首先要使用枚举类的方式,但这不是这个问题的重点。我已经定义了几个用于这些枚举类的运算符和函数,以及一个自定义类型特征来区分普通枚举和标志枚举。这是一个例子://Defaulttype_traitwhichdisablesthefollowingoperatorstemplatestructis_flags:std::false_type{};//Exampleoperatortouseenumclassasflagstemplatestd::enable_if_t::v
我在我的(C++)游戏中使用Lua作为脚本语言。在一次调用中(从lua到c++)我检查堆栈顶部的类型:if(lua_type(L,(0))==LUA_TSTRING)但有时lua_type(L,(0))返回9。我似乎找不到对此的任何引用(返回值应介于-1和8之间或LUA_TNONE、LUA_TNIL、...LUA_TTHREAD)。发生了什么事? 最佳答案 栈顶索引为-1,而不是0。0永远不能用作访问堆栈的索引:(Notethat0isneveranacceptableindex.)在§4.3–ValidandAcceptableI
据我了解5.2.9静态转换中的措辞,void*-to-object-pointer转换的结果唯一允许的时间是void*首先是反向转换的结果。在整个标准中有一堆对指针表示的引用,void指针的表示与char指针的表示相同,等等,但它似乎从来没有明确地说转换任意void指针会产生指向内存中相同位置的指针,具有不同的类型,就像类型双关未定义而不是双关一样对象的实际类型。因此,虽然malloc清楚地返回了合适内存的地址等,但据我所知,似乎没有任何方法可以移植地实际使用它。 最佳答案 C++0x标准草案在5.2.9/13中有:Anrvalue
我想在C++11中从其底层类型初始化一个强类型枚举,这是我从序列化流中读取的一个值,我必须检查它的数字范围是否正确。类似于:enumclassMyEnum{FOO,BAR};MyEnumtest=static_cast(1);这按预期工作,但问题是:MyEnumtest2=static_cast(42);也可以正常工作并且不会提示错误。据我所知,枚举类也没有任何关于如何检查输入是否有效的界限或其他指标的概念。在“旧式”枚举中,我们会包含MIN和MAX值并与它们进行比较,但是将这些值添加到强类型枚举中会再次向该类型添加无效值,从而破坏其目的。我有什么想法可以检查边界或在值超出边界的情况下
我问了一个问题DoC++PODtypeshaveRTTI?有人在评论中告诉我:PODtypesdohavetype_info,butdon'thaveRTTI,andthat'spossiblebecausetype_infoisn'talwaysRTTI.这似乎是正确的,因为我可以获得POD(非多态)类型的type_info。但是当我编译这个简单的程序时:#includestructX{inta;};intmain(){usingnamespacestd;std::cout带有GCC的标志-fno-rtti:$g++-fno-rttimain.cpp&&./main它不会编译:mai
我有一个函数,其中有一个包含字符串的容器(例如vector、set、list),并且给定一个开始迭代器和一个结束迭代器,通过迭代器范围处理字符串。目前函数声明如下:templatevoidProcessStrings(ContainerIterbegin,ContainerIterend);现在这将接受任何符合实现operator*的隐式接口(interface)的类型,前缀operator++以及函数体中的任何其他调用。我真正想做的是像下面这样明确限制输入量的定义(伪代码警告):template::iterator>voidProcessStrings(Container::iter