问题标签 [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.

0 投票
0 回答
215 浏览

boost - 哪些 boost 工具组合允许使用抽象工厂设计模式?

据我了解,boost::function、boost::factory 和 std::map 的组合允许创建对象工厂。http://www.boost.org/doc/libs/1_49_0/libs/functional/factory/doc/html/index.html Loki 有抽象工厂,但由于某种原因 boost 没有它。使用抽象工厂模式的提升方式是什么?

我能想到的一种方法是抽象一个用于手动创建产品的接口——通过创建具有相同创建策略的产品。

如果您的答案使用静态多态性,我会更高兴。

0 投票
4 回答
6122 浏览

c++ - C ++中的动态与静态多态性:哪个更可取?

我了解动态/静态多态性取决于应用程序设计和要求。但是,如果可能的话,是否总是选择静态多态性而不是动态多态性?特别是,我可以在我的应用程序中看到以下 2 种设计选择,这两种选择似乎都被建议不要使用:

  1. 使用 CRTP 实现静态多态性:没有 vtable 查找开销,同时仍以模板基类的形式提供接口。但是,使用大量的 switch 和 static_cast 来访问正确的类/方法,这是危险的

  2. 动态多态性:实现接口(纯虚拟类),将查找成本与访问器/突变器等微不足道的函数关联起来

我的应用程序对时间非常关键,所以我赞成静态多态性。但是需要知道使用过多的 static_cast 是否表明设计不佳,以及如何在不产生延迟的情况下避免这种情况。

编辑:感谢您的洞察力。举一个具体的案例,其中哪一个是更好的方法?

或者

请注意,每个类中有几个修改器/访问器,我确实需要在我的应用程序中指定一个接口。在静态多态中,我只切换一次——获取消息类型。但是,在动态多态性中,我使用虚函数进行每个方法调用。这不是使用静态多边形的理由吗?我相信 CRTP 中的 static_cast 非常安全并且没有性能损失(编译时间限制)?

0 投票
2 回答
284 浏览

c++ - 带有模板叶类的奇怪重复模板

我正在考虑为我的应用程序使用奇怪的重复模板模式。但是,我希望这些类对用户定义的类型进行操作。我想了解是否可以创建类似于下图所示的结构:

上面的代码编译失败,出现以下错误:

'模板类 BaseTrajectoryPoint' 的模板参数列表中参数 1 的类型/值不匹配</p>

有没有其他解决问题的方法?我想使用静态多态性,但我更愿意在基类中定义所有可能的方法。

0 投票
2 回答
380 浏览

boost - 通过 CRTP 基于基类中的 boost 智能指针为派生类成员分配内存

这部分问题提供了背景信息,可以忽略

我正在开发一个模板库,该库严重依赖于奇怪重复的模板模式的使用。类结构背后的想法是用户可以

1)。使用带有标准方法的预定义类。这些类是基类的非常简单的叶子,仅提供构造函数/析构函数,声明变量成员并将基类声明为友元。对派生类的变量成员进行操作的所有方法都在基类中定义。

2)。使用基类创建他/她自己的扩展。这种方法还允许用户引入他们自己的方法来操作相同的变量成员。

设计仅强制执行单级继承。

我的问题主要是关于第 2 条。在当前的实现中,用户必须隐式定义所有构造函数(即描述类的动态变量成员的内存分配的完整过程等)。

问题

下面的示例演示了对使用 CRTP 在基类构造函数中提供派生类的堆变量的内存分配定义的可能性的调查。

基类的一部分

派生类:

主要的:

该代码产生以下输出:

输出表明该概念可能是可行的。但是,我有两个问题。

1)。我想确保我了解代码执行期间发生的所有过程。特别是,我对流程的效率感兴趣,因为我可能需要从上面介绍的类中实例化大量对象,并且我想了解会发生什么Point(是否有任何隐藏的重新定义?)

2)。这个问题与使用库boost为派生类的成员定义智能指针有关。当我尝试用 替换原始指针时boost::shared_ptr,在尝试通过基类为派生类的成员分配内存时收到分段错误错误。代码的重要部分如下所示。

基类的一部分:

部分派生类:

主要的:

该代码产生以下输出:

我也试过了scoped_ptr。但是,它在运行时失败,但出现了不同的错误:

我假设它与boost智能指针的操作细节有关。有谁知道如何解决这个问题?

0 投票
2 回答
388 浏览

c++ - 静态多态性和方法名称 c++

当我使用静态多态性 (CRTP) 时,是否有一种很好的方法可以为多态方法命名?

因为,据我所知,接口和实现不能有相同的名称(如果它们是虚拟的,它们就会有相同的名称)。如果类层次结构很深,那就有点尴尬了。

也许有一些很好的方法来处理它?或者也许我错了?

0 投票
1 回答
307 浏览

c++ - 选择从哪个 CRTP 基类派生

假设我有以下非常简单的 CRTP 基类:

而且,少数派生类。一切运行良好,但存在一个问题:在一种特殊情况(或者可能是几种情况)中,我真的非常非常希望两个类具有运行时多态行为(需要将它们放入容器中)。换句话说,我希望一些派生 CRTP 类也具有虚拟版本。所以,我想出了以下课程:

现在,在我需要运行时多态性的地方,我只是从这个类派生而来。假设我希望我的派生类DerivedB有一个虚拟版本。香草 DerivedB 看起来像这样:

我想做的基本上是向此类添加一个额外的模板参数,以便我可以在编译时选择是从 Base 派生(如果我想要模拟的“动态”绑定)还是 VirtualBase(如果我想要真正的动态绑定)。类似于以下伪 C++ 的东西:

因此,对于普通的 CRTP,传递BaseB,对于虚拟类,传递VirtualBaseB. 当然,问题在于它们采用不同数量的参数(Base需要派生类的类型),我无法提出可行的解决方案。

那么,我将如何在编译时选择基类?或者,如果这太复杂/不可能,那么拥有类的静态(CRTP)和动态(虚拟)版本的最简单方法是什么,否则实现是相同的?

0 投票
5 回答
1609 浏览

polymorphism - 在 UML 类图中描述静态多态性

我有一个在编译期间根据构建配置实例化的对象。就所考虑的周围软件而言,该对象公开了相同的接口。我想模拟在编译期间做出实例化决定的事实(即static polymorphism),而不是通常的动态多态性。

有没有办法描述静态多态性UML class diagram

这或多或少是我需要的:

在此处输入图像描述

显然,只有上述类型定义之一将在编译时被实例化。

0 投票
1 回答
301 浏览

c++ - Curiously Recurring Template Pattern and statics in the base class

So thanks to this answer I'm looking at implementing my problem with CRTP. However I have a problem. In my static base class I have 2 sets of functions. One takes std::vectors and one takes a standard C-style array. So in the base class I define a static function that calls the non-std::vector function.

However when I derive from that base class I seem to no longer be able to access the public static function in the base class (Which I thought I could).

I then define the derived class as follows:

However when I try to call the static function in the Base class:

From the Derived class it throws a compilation error:

I assumed that I would be able to call a public static defined in the base class from the Derived class. This appears not to be the case, however ... Can anyone suggest a workaround that doesn't mean having to implement the std::vector function in every one of my Derived classes?

0 投票
7 回答
8519 浏览

c++ - CRTP 和多级继承

我的一个朋友问我“如何使用 CRTP 替换多级继承中的多态性”。更准确地说,在这样的情况下:

我和我的朋友都知道 CRTP 不是多态性的直接替代品,但我们对两种模式都可以使用的情况感兴趣。(为了这个问题,我们对每种模式的优缺点不感兴趣。)

  1. 之前有人问过这个问题,但事实证明作者想要实现命名参数习语,他自己的答案更多地关注这个问题而不是 CRTP。另一方面,投票最多的答案似乎只是派生类方法在基类中调用其同音词。

  2. 我想出了一个答案(发布在下面),其中包含很多样板代码,我想知道是否有更简单的替代方案。

0 投票
1 回答
67 浏览

c++ - 如何在策略之间共享成员?

假设我有一个包含成员的主机类:

我想在 p1 和 p2 中使用相同的成员:

有没有办法做到这一点?

我能想到的一种方法是通过虚拟继承从另一个包含成员的类派生p1和派生,这使得事情变得复杂。p2

另一种是将成员作为函数的参数传递给策略。像这样的东西:

另一个想法是使用 CRTP 并从策略中派生主机并从主机中派生策略,以便可以访问成员,using但这是不可能的。

更新 (1)

我对 CRTP 的尝试