问题标签 [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 投票
1 回答
2175 浏览

c++ - C++ 静态而不是动态多态

我正在尝试构建一个通用算法。到目前为止,我已经使用类层次结构和指针实现了这一点,如下例所示:

然后按如下方式实施此设置:

当然,这是一个非常简单的例子,但它适用于我的问题。据我了解,以这种方式使用派生类意味着该方法是在运行时而不是在编译时选择的。由于我的算法不需要任何动态行为——一切都是在编译时确定的——这是不必要的效率损失。有没有办法在编译时执行上述操作,即静态多态性?

据我了解,只能使用模板获得静态多态性。但是,我无法找到具有非原始类型的实现模板。就像上面的例子一样,我需要具有非默认构造函数的派生类,这似乎是不可能的......有人可以提供任何解决方案来解决这个问题吗?

0 投票
0 回答
236 浏览

c++ - 在这种情况下,动态多态性是开销吗?

我正在尝试通过 C++ 继承对一些与数据库相关的功能进行建模。数据库中有大约 150 个表。并且这些表属于特定组,并且可以以类似的方式对特定组中的表进行操作(查询、写入等)。

可能有更多的 GroupTables,继承也可以更深层次。

通过这种继承,我可以像这样初始化一个映射:

因此,tablesMap 将包含所有 150 个表的映射(为简单起见,我按升序使用了简单的键。但键可能不同。因此使用映射而不是向量)。有了这张地图,我可以迭代并调用 x->create_table()、x->query() 等。或者当我想对特定表执行特定操作时,我可以简单地调用

并且多态性将负责调用正确的函数。

我担心的是存储这些动态多态对象并像我上面描述的那样使用它是否存在开销。还是我只是偏执?请注意,映射中总是有固定数量的对象被初始化一次(约 150 等于表的数量),我将遍历这些对象并在需要的地方调用各种虚拟函数。

有没有更好的方法来模拟问题,以便我可以避免使用虚函数?我试图按照 CRTP(静态多态性)的思路进行思考,但我想不出一种方法将对象放入映射中并像使用动态多态性一样遍历它们。

0 投票
2 回答
1733 浏览

c++ - 静态多态对实现接口有意义吗?

祝大家圣诞快乐!

我正在学习静态多态性,并且正在阅读 Andrei Alexandrescu 关于基于策略的设计的优秀书籍。我在我的代码中遇到了以下内容:我有接口Interface指定Foo必须存在该方法。该接口将由 class 实现Impl。我有以下两个选择:

1)动态多态性

2) 静态多态性

在这种情况下使用静态多态是否有意义?与第一种方法相比,第二种方法有什么好处吗?接口只指定了一些方法的存在,并且它的机制对于不同的实现是相同的——所以不太像书中描述的案例,所以我觉得我可能只是把事情复杂化了。

更新:我在运行时不需要多态行为;正确的实现在编译时是已知的。

0 投票
5 回答
4096 浏览

c++ - C++ 中是否存在真正的静态多态性?

下面是一个简单的 C++ 代码:

我读过 C++ 中的模板是一个编译时特性,它不像 C#/Java 中的泛型。

据我了解,C ++编译器会将单个定义的函数划分为各种数量(取决于不同类型的调用计数)的函数。

我是对还是错?我不是 C++ 编译器方面的专家,所以我向您请教一条建议。

如果我对编译器输出的建议是正确的,我想知道我是否可以将上面的代码描述为静态多态性

因为它似乎没有覆盖,而只是从可执行文件中调用一个副本,或者......应用程序在输出二进制图像中有什么并不重要,但只有重要的部分是在 C++ 代码级别,我不必看编译器如何产生输出。

0 投票
1 回答
1847 浏览

c++ - 在编译时查找基类

标题几乎说明了一切:C++ 中有没有办法在编译时获取类的基类型?IE。是否可以将一个类交给一个模板,并让模板使用其他模板,它将给定类的基础交给它?

我的问题不是我是否可以自己实现这样的功能,毫无疑问我可以(使用特征等)。我的问题是是否有一些(晦涩的)内置功能可以用于此目的。

0 投票
2 回答
2153 浏览

c++ - 静态多态的 Strategy 和 CRTP 有什么区别?

我希望有一个在编译时选择的具有多种可能实现的接口。我看到 CRTP 是实现这一点的首选习语。这是为什么?另一种选择是策略模式,但我在任何地方都没有提到这种技术:

BrokenInterface不幸的是,在这两种情况下,编译器都不会捕获它,除非我真的尝试使用它。Strategy 变体对我来说似乎更好,因为它避免了丑陋static_cast,并且使用组合而不是继承。还有什么 CRTP 允许的,策略不允许的吗?为什么主要使用 CRTP 代替?

0 投票
1 回答
89 浏览

c++ - 在构造对象之前使用对象成员

我有以下简单的代码:

我知道创建对象时调用构造函数的顺序。构造函数是从“最基础 -> 向下”调用的。所以在 Base 构造函数中,Derived 对象没有完全构造。

1)Derived::foo在没有触摸对象时调用Base构造函数是否安全?我的意思是,当没有这样的线时,只是触摸对象。Derived::fooDeriveda = 4Base

2)如果我运行发布的代码,它确实有效,尽管我正在触及a当时不应该存在的代码。能保证工作吗?(我在 Ideone 上的 VS2013、VS2010 和GCC 4.8.1 上对其进行了测试

0 投票
1 回答
555 浏览

c++ - 奇怪地重复出现的模板模式和虚拟继承

我正在使用奇怪重复的模板模式来模拟静态多态性

这工作得很好,直到有人介绍virtual inheritance(解决 a diamond problem)。

然后编译器(Visual Studio 2013)开始抱怨

error C2635: cannot convert a 'Base*' to a 'Derived*'; conversion from a virtual base class is implied

基本上,这种转换是不允许的。

这是为什么?两者都static_cast失败c-style cast

有没有不放弃其中一个的解决方案?

编辑:

这是一个示例(删除虚拟并且它可以工作):

0 投票
3 回答
674 浏览

c++ - 为什么在通过模板进行静态调度时不需要前向声明?

我正在玩一些静态多态性,我正在调用一个函数,该函数在内部根据初始参数的类型调用“正确的”专用函数(基本上我正在做标记)。这是代码:

因此,f(T)使用参数调用my_type1my_type2在内部必须tag_type使用适当的标签tag1/进行 typedef 调用tag2。根据这个 internal tag_type,然后调用“正确的”包装器,这个决定当然是在编译时做出的。现在我真的不明白为什么这段代码有效?为什么我们不需要前向声明f_helper?我首先在之前main(和之后f)定义了包装器,虽然我还可以,这是有道理的,你不需要转发声明,因为编译器仅在f(type1);调用(in main())时才实例化模板,然后它不知道类型T,所以在实例化的时候编译器就知道了f_wrapper

但是如您所见,即使我声明了包装器 AFTER main(),代码仍然有效。为什么会这样?我想这个问题有点奇怪,问为什么代码有效:)


编辑

即使在 gcc5 和 gcc HEAD 6.0.0 中,代码也会继续编译。

0 投票
0 回答
36 浏览

c++ - 模板编译器限制?

这个错误很难解释,但它来自使用静态多态性有点极端。

请参阅以下代码。在代码中,如果我从模板化类派生模板化类,然后使用具有多个模板参数的模板化函数,我会得到一个不太有用的编译错误

如果派生类本身没有模板化,奇怪的是,或者模板化函数只有一个模板参数时,不会发生此问题。我完全被难住了,所以任何帮助将不胜感激。我在 Fedora 7 上使用 gcc 4.7.2。