问题标签 [generic-programming]

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 投票
2 回答
464 浏览

c++ - 将“哑”函数重构为具有容器迭代器的通用 STL 样式

我已经设法了解了 C++ 的一些功能能力(for_each、映射函数、使用迭代器...),但是用于接收通用容器和迭代器的模板和函数参数列表的构造仍然让我望而却步。我有一个实际的例子,希望有人可以为我说明:

采用以下函数来处理传入的 std::vector 并构建一个进程的许多数据点/迭代的运行总数:

上面的工作,但我更愿意有一个函数来接受迭代器并执行这个求和。更好的是,有一个类型推导的通用参数列表,而不是指定容器类型,即:

在这一点上我真的很迷茫,需要一些指导来找到如何定义模板和参数列表以使函数通用。模板和函数定义会是什么样子?我已经熟悉使用 STL 功能执行此特定任务的方法 - 我正在寻找通用函数/模板定义的说明。

0 投票
2 回答
786 浏览

scala - Scala 的数据类型通用编程库

我正在寻找一个允许数据类型泛型编程的 Scala 库(例如Scrap Your Boilerplate)。一个包含适当链接和简短描述的库列表将是一个完美的答案。

0 投票
3 回答
6649 浏览

c# - 具有泛型类型参数的类型的 C# 扩展方法

我正在寻找方法来提高我正在开发的应用程序中某些代码的一致性、简洁性和可读性。起始代码如下所示:

与上面类似,有许多几乎相同的代码行。我想重写它看起来像这样:

一方面,这将使我能够利用正式化已经成为非正式公约的机会。另外,我希望它现在可以读到类似“bar subscribes to the fizz event on the given context”,而不是“context 获取 bar 类型并订阅 fizz 然后做一些事情”。我认为流程更好,我问过的同事同意了。

我开始将其作为扩展方法来实现。为了完成上述任务,我想为事件类型使用一个抽象的泛型基类,Fizz所以Event<T>. 这意味着扩展方法的泛型类型参数必须被限制为调用扩展方法的类型。所以,对于上面的例子,Fizz必须是 type Event<Bar>

这可能吗?与此同时,我选择了另一种解决方案,但我仍然很好奇它是否可以实现。也欢迎其他建议。

谢谢!

编辑#1:为了清楚起见,我意识到我可以使用额外的类型参数,但我正在寻找尽可能避免这种情况的方法。

编辑#2:我认为我将对接受的答案稍作改动,因为它与我的场景不匹配 100%。底线是可以使用通用静态类代替 Type 的扩展方法来实现我的目标。谢谢dss539!

更新代码(可能有错别字,因为我是在即时执行此操作):

0 投票
7 回答
2646 浏览

c++ - 你觉得什么是过度概括?

花了一些时间在 Haskell 和其他函数式语言中玩耍后,我开始欣赏从概括描述问题而来的设计的简单性。虽然模板编程的许多方面可能远非简单,但有些用途很常见,我认为它们不会妨碍清晰(尤其是函数模板)。我发现模板通常可以简化当前设计,同时自动添加一些未来阻力。为什么要将它们的功能降级给库编写者?

另一方面,有些人似乎避免使用像瘟疫这样的模板。十年前我可以理解这一点,当时泛型类型的概念对于大多数编程社区来说都是陌生的。但是现在所有流行的静态类型 OO 语言都支持一种或另一种形式的泛型。增加的熟悉度似乎需要对保守态度进行调整。

最近有人向我表达了这样一种保守的态度:

你永远不应该做任何比必要的更通用的东西——软件开发的基本规则。

老实说,我很惊讶看到这种说法如此不屑一顾,好像它应该是不言而喻的。就我个人而言,我发现它远非不言而喻,除非您另有说明,否则像 Haskell 这样的语言都是通用的。话虽如此,我想我明白这种观点的来源。

在我的脑海里,我确实有类似的规则在喋喋不休。现在它处于最前沿,我意识到我总是从整体架构的角度来解释它。例如,如果您有一个类,您不想在其中加载大量您可能有一天会使用的功能。如果您只需要一个具体版本,请不要费心制作接口(尽管可模拟性可能与此相反)。像这样的东西...

然而,我不做的是在微观层面上应用这个原则。如果我有一个没有理由依赖于任何特定类型的小型实用函数,我将制作一个模板。

那你怎么看,所以?你认为什么是过度概括?这条规则是否根据上下文有不同的适用性?你甚至同意这是一条规则吗?

0 投票
3 回答
1828 浏览

c# - C#泛型如何定义T是Base: 其中 Tp : 基数和呼叫基地方法

我有混乱的情况。

基本通用类型和继任者

它看起来像一个通用循环)))

我需要类似的方法

在通用方法中,我需要定义 T 是 BaseType 和它的 exec 方法。我怎样才能做到这一点????

0 投票
2 回答
971 浏览

c++ - 模板模板总专业化

模板模板规范是这样的:

我应该如何为这个模板创建一个全部(或部分)专业化?这可能吗?

0 投票
1 回答
1174 浏览

f# - 在 f# 中报废你的样板文件

我在 Haskell 编程语言中使用了Scrap Your Boilerplate和 Uniplate 库,我发现这种形式的泛型编程在可区分联合上非常有用。f# 编程语言中是否有等效的库?

0 投票
2 回答
1405 浏览

c++ - 用作模板化函数输入的函数的 void 返回值被视为参数

假设你有一些目标类,上面有一些方法:

还有一个 Value 类(在概念上类似于 Boost.Any):

我想使用 Subject 类中的方法生成一个 Value 对象:

在 VC++2008 中出现以下错误:

和 gcc 4.4.3:

上下文是当您想在模板类中使用它时:

在返回某些内容(即 intReturn)的方法上使用此 Method 类将如下所示:

但是,使用 voidReturn 方法执行此操作:

产生与上述类似的错误。

一种解决方案是进一步对 void 返回类型的方法进行部分专门化:

除了感觉难看之外,我还想将 Method 类专门用于 X 个签名参数,这已经涉及大量代码重复(希望 Boost.Preprocessor 可以在这里提供帮助),然后为 void 返回类型添加专门化只是将重复工作加倍。

无论如何要避免 void 返回类型的第二个专业化?

0 投票
4 回答
967 浏览

c# - 泛型类型的继承

谁能帮助我将 Where 用于泛型类型?我试图创建一个函数,它使用一些 double 或 int 类型执行 ST,所以我说它应该是通用函数。但是当我尝试为该泛型类型的变量赋值时,我不能,因为它不是数字类型。此外,我不能使用 Where 从 int 或 double 数据类型继承泛型类型。

这是代码:
public static T[,] Unit(int n) where T : PROBLEM
{

}

任何人都可以帮忙吗?

0 投票
4 回答
52541 浏览

actionscript-3 - AS3 从(对象)数组中删除元素

有没有办法从数组中删除一个对象?
(可能不使用 array.filter 或创建一个新数组)

例子:

目前我正在使用 array.splice() 删除对象

我想以这样的方式编写 removeElement,以便我可以将它用于不同类型的对象。
目前removeElement变得依赖于实现。
假设我想从给定文件名的文件数组中删除一个文件。我必须通过更改标准再次编写“removeElement”。

也可能我可以改变标准吗?例子 :

将从“站点”属性等于“http://www.mysite.com/6”的 arr 中删除对象(使用上面的示例)

谢谢大家。