草庐IT

dynamic-method

全部标签

c++ - dynamic_cast 不适用于非多态类型的原因

对于类B和派生类D:classB{intb;};classD:publicB{intd;};D*d=newD();B*b=dynamic_cast(d);上面的代码可以正常工作——这是一个简单的向上转换。我们确信无论b指向什么,它都有B类(子)对象。但是,B*b=newD();D*d=dynamic_cast(b);不会编译,即使b指向一个有效的D实例——因为基类不是多态的。所以只添加一个空虚方法就可以解决问题。重要的问题是为什么C++要求源类型是多态的?我找到的唯一解释是this,但它只是说“因为这就是它在内部实现的方式”——至少在我看来是这样)。设计dynamic_cast的人可能

c++ - C++ 中 "extension methods"的标准化提案在哪里?

我忘记了用于描述我大约一年前(也许更久)前看到的提案中使用的功能的确切术语。它看起来类似于C#扩展方法,因为可以使用类成员语法调用定义为类接口(interface)一部分的全局函数。非常非常愚蠢的例子:classFoo{public:voidOne();};voidTwo(Foo&);intmain(){Foof;f.One();f.Two();//ThiswasvalidintheproposalIsaw}我确信我的代码示例已经过时了,但我更多地使用它来尝试传达我记得看到的功能。我是完全离开这里还是有C++的提案引入了这种机制?如果是这样,有人可以向我指出该提案及其状态/时间表吗?

c++ - "the procedure entry point _ZNSt8_detail15_List_node_base7_M_hookEPS0_ could not be located in the dynamic link library libstdc -6.dll."

有个小问题。我有C++代码,它链接到一些库。我以前有源代码的(原始)exe,它在第一台机器上运行完美。还有第二台机器,我在那里处理源代码,更改它,等等。在第二台机器上,该源代码的构建工作正常,当我复制second.exe并尝试在第一台机器上运行它时萌芽它显示错误信息"theprocedureentrypoint_ZNSt8_detail15_List_node_base7_M_hookEPS0_couldnotbelocatedinthedynamiclinklibrarylibstdc++-6.dll."有一件事,second.exe被复制到与original.exe相同的文件夹中,

c++ - 从字符串设置 boost dynamic_bitset

Dynamicbitset我有一个需要填充的用例boost::dynamic_bitset,fromastd::stringbuffer.你能建议如何去做吗?所以我需要想出一个函数voidpopulateBitSet(std::string&buffer,boost::dynamic_bitset&bitMap){//populatebitMapfromastringbuffer} 最佳答案 如果你有这样的二进制数据:stringbuffer="0101001111011";您想像这样初始化它(原来有一个constructor可以处

c++ - dynamic_cast 中的模糊转换

考虑获取对象作为参数并打印其类型的问题:#includeclassA{};classB:publicA{};classC:publicA{};classD:publicC,publicB{};usingnamespacestd;templatevoidprint_type(T*info){if(dynamic_cast(info))cout(info))cout(info))cout(info))cout它给我以下错误:“从派生类‘D’到基类的转换不明确。”但是我没看出歧义在哪里:如果main(d)中声明的对象是D类型,为什么不能直接转换为A类型呢?此外,如果我传递一个字符串类型的参数

c++ - 将 dynamic_cast 与模板一起使用

在用C++实现基于模板的工厂时,我创建了以下allocator函数来实例化给定的子类:templateParentClass*allocator(){ChildClass*child=newChildClass();ParentClass*parent=dynamic_cast(child);if(NULL==parent){deletechild;returnNULL;}returnparent;}一切正常,但是当通过静态代码分析工具(如coverity)运行代码时,deletechild;行被标记为逻辑死代码。我进行运行时检查的原因是为了断言,ChildClass是从ParentC

c++ - 如何序列化 boost::dynamic_bitset?

如何使用boost::dynamic_bitset成员序列化一个类?#include#include#include#include#includeclassA{friendclassboost::serialization::access;boost::dynamic_bitsetx;templatevoidserialize(Archive&ar,constunsignedint){ar&x;}};intmain(){Aa;std::stringstreamss;boost::archive::text_oarchiveoa(ss);oa编译报错(boost1.57)Infilei

c++ - 概念 : checking signatures of methods with arguments

我一直在研究概念。这是一个最小的例子,我试图在其中创建一个基于方法签名的概念:templateconceptboolmyConcept(){returnrequires(Ta,inti){{a.foo()}->int;{a.bar(i)}->int;};}structObject{intfoo(){return0;}intbar(int){return0;}};static_assert(myConcept(),"ObjectdoesnotadheretomyConcept");令我惊讶的是,编写{a.bar(int)}->int不起作用,所以我求助于向requires表达式添加一个额

c++ - CRTP 静态多态性 : Using the Base Class to Call Derived Methods

C++中virtual的主要好处之一是能够使用基类(指针或引用)调用派生方法。我正在阅读usingCRTPtoimplementstaticpolymorphism,但我不明白如何使用这种技术实现上面提到的内容,因为当需要模板时,我无法将函数声明为采用Base类型。在我看来,文章中描述的内容可以通过简单地使用函数重载来实现,所以我确信这种技术一定有更多。(PS:在对thisquestion的回答的评论中提到了这个确切的问题,但不幸的是没有人回复它:“vtables真正提供的是使用基类(指针或引用)来调用派生方法。你应该在这里展示它是如何用CRTP完成的。”)这是我的最小代码,它给出了错

c++ - 是否可以使用 dynamic_cast 进行模板类型检查?

templatevoidcheckObject(TgenericObject){MyClassA*a=dynamic_cast(genericObject);if(a!=NULL){//weknowitisoftypeMyClassA}MyClassB*b=dynamic_cast(genericObject);if(b!=NULL){//weknowitisoftypeMyClassB}}这样的事情可能吗?我们有一个模板类型,但我们想知道它是实际类型吗? 最佳答案 在模板世界中,您可能只想为每种类型专门化模板,而不是进行运行时检查