问题标签 [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 回答
362 浏览

templates - C++:派生模板类和基类之间的向下转换和向上转换?

我无法将指向模板派生类的指针转换为基类指针,以便存储在地图中(显然稍后再检索它。)。我有:

为什么会这样,有没有办法解决这个问题,这样我就可以使用枚举值对一个类进行模板化,以便通过getClass<Enum>函数从外部调用,正如示例中所希望的那样?

0 投票
3 回答
871 浏览

c++ - c ++:如果条件不满足,函数调用上的编译时错误?

这是我要实现的目标的简化示例。因此,它可能看起来有点傻,但请耐心等待。假设我有

和 aclass2具有固定int j变量:由此类 int 模板化或具有成员变量。我希望class2实例只有在满足特定条件时才能调用foo(),在这种情况下,我想确保 say (j%i==0).

我能想到的最好的方法是:

然后类 2 会这样称呼它:

这不是很好。有没有更好的方法来做到这一点?我见过' std::enable_if ',这有点相关,但我不太确定。

如果您想要更大的图景,这是一种信号/委托代理机制。在一个系统中,任务对象应该能够被执行者对象提供/请求,只有当它们与int i任务中指定的角色 enums() 匹配时。本质上,这应该是基于枚举的设计,没有动态多态性。在 C++ 中有没有更好的方法来做到这一点?

0 投票
0 回答
96 浏览

c++ - 继承的静态函数的返回类型

新年快乐!我对 C++ 及其社区都比较陌生,如有任何错误,我深表歉意。

我正在实现一个带有函数的mat(矩阵)类,带有返回类型。我想实现一个具有相同功能的子类(方阵),但返回.mat static Zeros(const int rows, const int cols)matsqmatZerossqmat

我来到了这个解决方案:

换句话说,我使用了一个备份成员函数zero来进行所有计算,而我使用了父类和子类中的静态函数来处理返回类型。这样可以避免代码重复,但感觉不对。

实际上,这需要为我想为父类和子类实现的每个静态函数创建一个备份成员函数,只返回适当的数据类型。有没有更有效的方法来处理这个问题?

不幸的是,在我的教科书和互联网上,多态性都是使用void返回函数来解释的,所以我没有很多例子。

PS请避免使用模板或“高级”方法

0 投票
2 回答
138 浏览

c++ - C++ - 为任何 lambda 创建一个实例化桶

我想在一个地方创建几个模板化 lambda 实例。每个实例化的数量和参数在编译时是已知的,所以我认为这是可能的。这是我想要做的一般说明:

这是我的问题的简化图像。一言以蔽之 - 我想存储任何 SomeData 对象的处理实例以供将来使用。我不知道在 C++14 甚至 C++17 中是否可行。而且我知道如果我使用动态多态而不是静态多态,这将很容易,但在这种情况下,性能对我来说意义重大。

编辑:

正如 TartanLlama 所注意到的 - 使用仿函数确实更容易实现,但更难使用。我对待Format,就像它是库/API 的一部分一样SomeDataProcessingForAllFormats我想尽可能地为该“库”的用户提供易用性。Lambda 旨在提供这一点。@AndyG 的建议很有用——对于 lambda,ProcessingForAllFormats 的实现必须不同。但我不知道 C++14/17 中的 lambda 模板是否足够强大来构建这样的 API。

0 投票
2 回答
313 浏览

c# - c#基于值而不是引用调度扩展方法

给定以下两种扩展方法

以及以下 2 次调用

即使它的引用类型是对象但它的值类型是EntityRestIdentityDescriber,我如何执行第二个扩展方法?我正在寻找静态多态性。

0 投票
1 回答
189 浏览

types - 我可以将类型作为参数传递给这个函数吗?

以下代码,主要是从

http://accord-framework.net/docs/html/T_Accord_MachineLearning_VectorMachines_Learning_SequentialMinimalOptimization.htm

工作正常。

我想实现一个多态版本train,比如

这不起作用,因为if表达式必须在其所有分支中返回相同类型的对象。

我想知道是否有一种方法可以传递LinearGaussian作为类型train(这些确实是类型),这样我就不必为每种类型(trainGaussiantrainLinear)编写一个火车函数。Akso,即使我不厌其烦地编写这些单独的函数,我想根据用户的选择在运行时调用它们也很困难,因为if语句的相同问题会引起丑陋的头脑。

我在F#使用接口时实现了多态性,但使用的是我自己构建的类。这些类在Accord.NET其中,即使它们从基类继承,我也无法处理类型问题并实现多态性。

感谢您的任何建议。

0 投票
2 回答
3844 浏览

c++ - C++ interface without virtual functions

I was wondering how we can declare an interface in C++ without using virtual functions. After some internet searching I put together this solution:

I'm planning to use this design strategy in a project where I will use static polymorphism only. The C++ standard I will use in the project is C++11.

What do you think are the pros and cons of this approach?

What improvements can be made on the code I proposed?

EDIT 1: I just realised that inheriting from Interface is not needed. This code could also be used:

EDIT 2-3: One major difference between the static_assert solution (with or without CRTP) and the standard CRTP is that the CRTP does not guarantee that the derived class implements all the interface members. E.g., the following code compiles correctly:

An error about a missing member function will be returned by the compiler only when the functions foo or bar will be required.

The way I see it, the static_assert solution feels more like an interface declaration than CRTP alone.

0 投票
0 回答
49 浏览

variadic-templates - 在 C++ 中用静态多态替换动态多态

由于 avr-g++ 将 vtables 放在 RAM 中这一事实的动机,我使用静态多态性编写了一个替换。

考虑以下示例:

这里我们有一些类型ABC实现了一个接口IX并在数组中放置了指针ccf()然后我们为特定实例调用虚函数。(在像 AVR 这样的小型 µC 上使用它会“浪费”RAM,因为 vtable 被放置在 RAM 中,并且每个对象都包含一个 vptr,并且由于间接调用f().

因此,我在这种情况下寻找了一种替代解决方案:最简单的方法是使用异构容器,例如std::tuple并编写一个 switch 语句:

这可以优化机器代码,但它是一个不灵活的解决方案。所以我写了一个元函数来调用f()元组的特定元素:

实现看起来像:

这在我的场景中效果很好,但显然仅限于静态容器(如std::tuple)。还有一个 for-each-like 迭代Meta::visit()

我的问题是:这种方法还有其他缺点/限制吗?

有什么改进吗?

0 投票
1 回答
123 浏览

c++ - 静态包装库的多态迭代器,而不将库暴露给用户

我目前正在将数据存储库集成到我的应用程序中。我需要能够为我的单元测试模拟这个数据存储(这是 I/O 密集型的),因此围绕该库的接口创建一个包装器。

不幸的是,在它的接口中,这个库将迭代器作为指针而不是值返回,因为它们在运行时是多态的。

我的问题是,由于我要添加的多态层,在运行时添加多态的迭代器似乎是不可避免的,因此会产生新的间接级别和一些更动态的分配......

这是一个非常多的指向取消引用的指针,每次使用迭代器的任何方法时的虚拟调度,加上每个迭代器创建的至少 2 个动态分配(lib 迭代器 + 我的)......

我正在考虑使用 CRTP 来帮助解决这个问题,但我想不出一种方法来阻止代码使用IMyDataStore来查看迭代器的具体实现流经MyIterator's 类型。

有什么我可能错过的技巧吗?

0 投票
0 回答
580 浏览

c++ - C++ - 静态多态与运行时多态与 Lambda

我了解了静态多态性和运行时多态性之间的区别,从那时起我就读了很多关于它的东西。另外,因为我发现实现了一个静态多态接口(以一种方式,一个类可以使用具有基类定义的对象,而不知道该对象是用什么“派生”类实例化的)。

所以我跑了一个小测试来比较这些不同的实现。

这是代码:

问题是,当我运行它时,虚拟实现是最快的,而静态多态应该更快。下面是一个执行结果示例:

虚拟执行时间:53 ms
lambda 执行时间:94 ms
模板执行时间:162 ms

我猜这是因为一些编译器优化。我用 gcc 6.3.0 编译。

我的问题是:为什么模板实现最慢?真的是因为编译器的优化吗?如果是,它们是什么,我怎样才能改变我的测试以获得“真正的”运行时间?如果没有,我做错了什么?