问题标签 [static-polymorphism]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 我可以用静态多态实现动态多态的所有功能吗?
我习惯使用dynamic polymorphism
并且一切正常,但是在阅读了关于static polymorphism
我的结论后,我得出结论,后者克服了动态的开销。
以下是动态多态性的一些开销:
每次调用虚拟方法的额外间接(指针取消引用)。
虚拟方法通常不能内联,这对一些小方法来说可能是一个重大的成本损失。
每个对象的附加指针。在当今流行的 64 位系统上,这是每个对象 8 个字节。对于携带少量数据的小对象,这可能是一个严重的开销。
谁能Static polymorphism
用一个非常简单的例子向我解释。什么情况下我应该使用它而不是动态的?
我找到了这个例子,但很抱歉我不明白。它看起来模棱两可:
c++ - CRTP静态多态:是否可以用mock替换基类?
我在 websocket 服务器中使用 CRTP 静态多态性来将网络代码与业务逻辑分离。基类调用派生类的方法来处理消息,派生类又调用基类进行发送/接收。它就像魅力一样,看起来像这样:
现在是单元测试。由于代码是解耦的,我希望分别在类中测试功能。
测试基类很简单:
但是如何测试派生类?我想到了添加一个 Base 模板参数,这使得测试代码正常(Base 是一个模拟类)。但我最终在生产版本中有 2 个模板类相互引用...... :(
有可能克服这个吗?
c++ - CRTP 没有编译时检查吗?
我试图使用Curiously Recurring Template Pattern实现静态多态性,当我注意到static_cast<>
通常在编译时检查一个类型是否实际上可以转换为另一个类型时,它错过了基类声明中的错字,从而允许代码向下转换基类类到它的兄弟姐妹之一:
程序的输出是:
为什么演员表工作没有错误?如何进行编译时检查以帮助解决此类错误?
c++ - C++ 多态静态可变子函数指针
我有一个类 A 是类 B 的子类,我需要类 B 的所有子类都有一个函数指针,该函数指针指向一个函数,用于处理在编译类后可由不同文件中的外部函数更改的类。A 类的所有实例都应该指向一个函数,B 的所有实例都应该指向一个函数,但是 A 和 B 应该能够指向不同的函数。我怎样才能做到这一点?我尝试了一个静态函数指针和一个私有静态函数指针,但都没有奏效。
我想要的输出是
c++ - C++ 将静态多态类自动添加到子类的 constexpr 列表中
我有大量订阅各种事件的子类,例如初始化和实体删除。
目前我通过这样做来解决这个问题
其中,使用多行编辑器并不难,阅读起来也很简单,但是有很多错误的空间,主要是记住将每个新类添加到调用部分,而不是像使用动态多态那样添加自己的类。
如何使用静态多态将其变成类似于
使用 objects-methods,制作 static_casted 对象的列表很容易。
但我需要类功能。因此,如果可能的话,最好通过继承超类来制作可迭代的类列表,而无需手动将它们添加到模板中。
c++ - 用于存储的抽象基类的替代方案
我想知道运行时多态性的可用替代方案,特别是在我的类之间使用公共基类的替代方案,以便存储派生类的实例并与之交互。RTP 存在通过 vtable 查找间接的缺点,并且还强制派生类存储为指针,因此通常必须动态分配它们。据我所知,这阻碍了内联和编译器优化。
简而言之,我不想要这个:
我想要这样的东西:
c++ - 奇怪地重复出现的模板模式 - 不能创建超过 1 个派生类?
我坚持使用这种模式,因为我创建的派生类中只有一个被实例化。用 g++ 和 MSVS 检查。具体来说,只有我定义的第一个派生类被创建。编译器不会发出任何类型的警告。下面提供了完整的代码。
输出是:
为什么我不能实例化第二个派生类?
typescript - this.constructor 的多态调用
错误的问题。示例代码工作。
考虑这段代码
问题是(this.constructor as typeof Object3D).parameterTypes
不是多态调用的,我想根据对象实例调用 Cube 或 Sphere 的 parameterTypes。
在 JavaScript 中这是直截了当的:this.constructor.parameterTypes
但 TypeScript 不允许我这样做 -> Property 'parameterTypes' does not exist on type 'Function'
有什么帮助吗?
我努力了:
但是这样做,多态又有什么用呢?
c++ - C++ 静态多态性——从基类指针引用派生类中重载的专用模板方法
我正在用 C++ 实现观察者模式的变体。但是,由于我项目的性质,它不能使用任何虚拟成员函数,因为 vtable 查找和缓存未命中的总开销是不可接受的。
如果我通过虚拟成员函数创建接口,我会简单地编写以下内容:
然后,例如,我可以有MessageSubscriber
一些实现MessageType
,的类SafetyMessage
,如下所示:
这将完成工作,但是,正如前面所强调的,vtable 查找开销在应用程序的上下文中是不可接受的,尽管它提供了多态便利,并且应用程序也需要它。然后,自然地,我尝试了几种围绕可以通过模板利用的静态多态性的方法。
我第一次尝试使用 CTRP,但在这种情况下它失败了,因为其中包含的指针在被调用MessagePublisher::subscribers
时必须指向同一个基类。MessagePublisher::Publish(MessageType *message)
因此,您不能有一些 CTRP 模式 MessageSubscriber<SafetyMessageSubscriberA>
,MessageSubscriber<SafetyMessageSubscriberB>
因为模板参数需要相同才能合法地允许两个对象进入MessagePublisher::subscribers
。
我最近对该问题的尝试使我尝试了成员函数模板专业化的一些变体,尽管没有成功。我在模式界面上尝试了以下变体:
使用以下实现:
但是,当我尝试这样做时,总是会调用基类MessagePublisher::Publish(SafetyMessage *message)
的通用实现,而不是为特定于.MessageSubscriber::OnMessage(MessageType *m)
SafetyMessage*
我是否按预期错误地专门化了功能模板,还是有另一种更有效的解决方案?对于与重载和成员模板专业化的概念有关的任何不精确的措辞,我提前道歉。
c# - 如何避免多个类中的静态方法的代码重复
我有多个包含重复代码的类,尤其是成员和最重要的静态方法,它将创建该类的新实例并返回此实例:以前在字典中注册的实例或通过调用构造函数的新实例。
接口是没有选择的,因为我有静态方法。我试图通过引入实现此静态方法的基类来解决该问题,但我找不到正确创建和返回特定子类的方法。
下面是当前情况的代码示例,A 类和 B 类显示重复代码。
然后在 B 类中再次有一个成员 Name 和 GetX() 方法。
是否有可能通过引入基类或任何其他方式来避免这种代码重复?