草庐IT

Duck-typing

全部标签

C++ 枚举类 - 从 underlying_type 初始化

我想在C++11中从其底层类型初始化一个强类型枚举,这是我从序列化流中读取的一个值,我必须检查它的数字范围是否正确。类似于:enumclassMyEnum{FOO,BAR};MyEnumtest=static_cast(1);这按预期工作,但问题是:MyEnumtest2=static_cast(42);也可以正常工作并且不会提示错误。据我所知,枚举类也没有任何关于如何检查输入是否有效的界限或其他指标的概念。在“旧式”枚举中,我们会包含MIN和MAX值并与它们进行比较,但是将这些值添加到强类型枚举中会再次向该类型添加无效值,从而破坏其目的。我有什么想法可以检查边界或在值超出边界的情况下

c++ - type_info 不是 RTTI 的一部分吗?

我问了一个问题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

c++ - 接受 STL_container_type<string>::iterator 的模板化参数

我有一个函数,其中有一个包含字符串的容器(例如vector、set、list),并且给定一个开始迭代器和一个结束迭代器,通过迭代器范围处理字符串。目前函数声明如下:templatevoidProcessStrings(ContainerIterbegin,ContainerIterend);现在这将接受任何符合实现operator*的隐式接口(interface)的类型,前缀operator++以及函数体中的任何其他调用。我真正想做的是像下面这样明确限制输入量的定义(伪代码警告):template::iterator>voidProcessStrings(Container::iter

c++ - (void*) 和 (void(*)(argument type)) cast 之间有什么区别?

这个问题在这里已经有了答案:WhyarefunctionpointersanddatapointersincompatibleinC/C++?(14个答案)关闭7年前。voidfuncPtr(inta);intmain(){intk=1;void(*funcPtr2)(int);funcPtr2=(void*)(funcPtr);//funcPtr2=(void(*)(int))(funcPtr);(*funcPtr2)(k);return0;}voidfuncPtr(inta){printf("%d",a);}函数指针类型转换中(void*)和(void(*)(argumenttyp

c++ - 为什么在下面的例子中 int(a) 是一个表达式而 int(unsigned(a)) 是一个 type-id?

在[dcl.ambig.res]/2我们发现以下内容:voidfoo(signedchara){sizeof(int(a));//expressionsizeof(int(unsigned(a)));//type-id(ill-formed)}为什么int(a)是一个表达式而int(unsigned(a))是一个type-id?乍一看,我会说两者都是表达式。 最佳答案 int(unsigned(a))的解析和int(unsigneda)一样,都是函数类型 关于c++-为什么在下面的例子中

c++ - 枚举 [标签] [ : type] {enum-list} [declarator] in C++ - is this legal?

我正在使用C++中的自定义枚举类型,但它没有很多值。我想尝试减小它们占用的大小,而且我听说enum类型是alwaysintegersbydefault.然后我遇到了MSDNentryonC++enumerations,发现下面的语法很有趣:enum[:type]{enum-list};果然,当我执行以下操作时,它编译出了我想要的(VS2008):enumplane:unsignedchar{xy,xz,yz};现在,您可以从我的枚举常量中看出我不需要太多空间-unsignedchar类型非常适合我的使用。但是,我不得不说,我从未在互联网上的其他地方任何地方见过这种形式——大多数人甚至似

c++ - SSE 和 iostream : wrong output for floating point types

测试.cpp:#includeusingnamespacestd;intmain(){doublepi=3.14;cout当使用g++-mno-ssetest.cpp在cygwin64位上编译时,输出为:pi:0但是,如果使用g++test.cpp编译,它可以正常工作。.我有GCC版本5.4.0。 最佳答案 是的,我复制了这个。嗯,主要是。我实际上没有得到0的输出,而是一些其他的垃圾输出。所以我可以重现无效的行为,并且我已经查明了原因。您可以看到GCC5.4.0使用-m64-mno-sse标志hereonGoldbolt'sComp

c++ - 变体访问和 common_type

我想知道如何std::visit返回类型转换应该有效。上下文如下:我有一个变体对象,我想根据其基础类型应用(通过std::visit)不同的函数。每个函数的结果可能有不同的类型,但我希望std::visit将它打包成一个变体类型。伪代码:我有:variantobjf(A)->Af(B)->B我要:ifobjisoftypeA=>applyf(A)=>resAoftypeA=>packitinvariantifobjisoftypeB=>applyf(B)=>resBoftypeB=>packitinvariant现在,根据cppreference,std::visit的返回类型是“访问

C++ 及其类型系统 : How to deal with data with multiple types?

“简介”我是C++的新手。我了解了所有基本内容,并设法为我的编程语言构建了2-3个简单的解释器。让我头疼的第一件事:用C++实现我的语言的类型系统想一想:Ruby、Python、PHP和Co.有很多内置类型,显然是用C实现的。所以我首先尝试的是在我的语言中使用三种可能的类型来给出一个值:Int、String和Nil。我想到了这个:enumValueType{Int,String,Nil};classValue{public:ValueTypetype;intintVal;stringstringVal;};是的,哇,我知道了。由于必须一直调用字符串分配器,因此传递此类非常慢。下次我尝试

c++ - 使用 C++ 样式转换从 Void* 转换为 TYPE*​​ : static_cast or reinterpret_cast

因此,如果您从Void*转换为Type*或从Type*转换为Void*,您应该使用:voidfunc(void*p){Params*params=static_cast(p);}或voidfunc(void*p){Params*params=reinterpret_cast(p);}对我来说static_cast似乎更正确,但我已经看到两者用于同一目的。此外,转换的方向是否重要。即我是否仍应将static_cast用于:_beginthread(func,0,static_cast(params)我已经阅读了关于C++样式转换的其他问题,但我仍然不确定这种情况下正确的方法是什么(我认为