草庐IT

dynamic-dispatch

全部标签

c++ - 通过继承层次结构进行 dynamic_casting 是不好的做法吗?

我有以下数据结构:classElement{std::stringgetType();std::stringgetId();virtualstd::vectorgetChildren();}classA:publicElement{voidaddA(constA*a);voidaddB(constB*b);voidaddC(constC*c);std::vectorgetChildren();}classB:publicElement{voidaddB(constB*b);voidaddC(constC*c);std::vectorgetChildren();}classC:publi

c++ - 编译时分派(dispatch) : conditional on valid call

给定以下代码:templateclassJoinedObjectGroup:public_ObjectSpaceHolder,public_ObjectSpaceHolder{public:JoinedObjectGroup(GroupA&groupA,GroupB&groupB):_ObjectSpaceHolder(groupA),_ObjectSpaceHolder(groupB){}templateObjectTypeget(){//Dispatchtoappropriatehandler:onlyoneofthefollowingactuallycompilesas//eit

c++ - (Swig to python)导入错误:dynamic module does not define init function

我正在尝试通过swig将我的C++代码移植到Python。当我完成py、pyd、cxx和lib文件的构建时,在Python(命令行)下,我键入“模块Dnld”,它显示->导入错误:动态模块未定义初始化函数。以下是我的代码,进一步:添加我的构建步骤以避免误解,谢谢MarkTolonen文件->新建->项目->Windows控制台应用程序->选择DLL和空项目(无unicode)将我的SerialComm文件夹添加到项目中(包括DownloaderEngine.hSerial.hPortEnumerator.h等)。配置属性->c/c++->附加包含目录->C:\Python27\incl

带有模板参数的 C++ 函数分派(dispatch)

我正在重构一个大类——我们称它为Big——它有大量的复制粘贴代码。大部分复制粘贴代码都存在于switchcase中,其中只有涉及的类型最终有所不同。代码根据类的enum成员变量进行切换,该类的值仅在运行时才知道。我试图解决这个问题涉及到有一个Dispatcher类,它通过一个名为lookup()的static函数查找适当类型的函数。执行实际工作的函数总是称为go()并且必须在包装类模板中定义(其唯一参数是当前正在打开的运行时enum值).go()函数本身可能是也可能不是模板函数。这是代码的精简版。对于篇幅,我深表歉意,但这是我在不丢失重要上下文的情况下所能做到的最短。#includec

c++ - 这是 "Tag Dispatching"吗?

假设我有一些代码:voidbarA(){}voidbarB(){}voidfooA(){//Duplicatecode...barA();//Moreduplicatecode...}voidfooB(){//Duplicatecode...barB();//Moreduplicatecode...}intmain(){fooA();fooB();}我想删除fooA和fooB之间的重复代码我可以使用一些动态技术,例如传入bool参数、传递函数指针或虚拟方法,但如果我想要编译时技术,我可以这样做:structA{};structB{};templatevoidbar();template

c++ - 为什么在 C++ 中虚拟函数表指针 (vfptr) 不能是静态的?

如果类的所有对象的虚函数表都是相同的,那么为什么指向该表的指针(vfptr)不能是静态的并在所有对象之间共享? 最佳答案 vtable本质上是静态的。但是您需要一个实际位于对象内部的vptr成员来执行虚拟分派(dispatch)和其他RTTI操作。在vptr实现上,此C++代码:classBase{public:virtualvoidf();};classDerived:publicBase{public:virtualvoidf();};可能会像下面这样:classBase{public:Base::Base():m_vptr(&

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++ 中模拟动态调度

为了问题的缘故,这被大大简化了。假设我有一个层次结构:structBase{virtualintprecision()const=0;};templatestructDerived:publicBase{typedefTraits::TypeType;Derived(Typedata):value(data){}virtualintprecision()const{returnPrecision;}Typevalue;};我想要一个带有签名的非模板函数:Base*function(constBase&a,constBase&b);其中函数结果的特定类型与a和b中具有较大Precisio

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++ - 删除运算符如何使用指向基类的指针释放内存

考虑这段代码:classbase{T*obj=newT[40];//...public:base(){/*...*/}virtual~base(){delete[]obj;//...}...};classderived:publicbase{T*obj2=newT[20];//...public:derived(){/*...*/}~derived(){delete[]obj2;//...}...};voidfunc(){base&&exmp=giveder();//giveder()returnsderivedbase*dis=newderived[50];//...delete[]