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

c++ - 函数局部静态常量变量初始化语义

这些问题以粗体显示,适用于那些不想深入阅读问题的人。

这是对这个问题的跟进。它与函数中静态变量的初始化语义有关。静态变量应该初始化一次,它们的内部状态可能会在以后改变——就像我(目前)在链接问题中所做的那样。但是,有问题的代码不需要该功能稍后更改变量的状态。

让我澄清一下我的立场,因为我不需要更改字符串对象的内部状态。该代码用于元编程的特征类,因此将受益于 const char * const ptr - 因此理想情况下需要本地成本静态 const 变量。我有根据的猜测是,在这种情况下,有问题的字符串将由链接加载器最佳地放置在内存中,并且代码更安全并映射到预期的语义。

这导致了这样一个变量的语义“C++ 编程语言第三版——Stroustrup”没有任何(我能找到的)关于这个问题的说法。所说的只是当线程的控制流第一次到达代码时,变量被初始化一次。这让我思考以下代码是否合理,如果不是,那么预期的语义是什么?

以下在 GCC 上编译并打印“yahoo”两次。这就是我想要的——但是它可能不符合标准(这就是我发布这个问题的原因)。有两个函数可能更优雅,“SetString”和“String”,后者转发到第一个。如果它符合标准,是否有人知道 boost(或其他地方)中的模板实现?

编辑:2010 年 5 月 11 日

我正在使用以下宏在我的类中生成上述的 getter/setter 来编码编译时间信息。

这些宏被放置在类声明中。例如:

希望这对其他人有用。

0 投票
5 回答
461 浏览

scheme - 惯用方案和通用编程,为什么只在数字上?

在 Scheme 中,像 +、-、*、/ 这样的过程适用于不同类型的数字,但我们看不到任何其他通用过程。

例如,长度仅适用于列表,因此需要向量长度和字符串长度。

我想这是因为该语言并没有真正提供任何机制来定义通用过程(当然 cond 除外),例如 Haskell 或标准化对象系统中的“类型类”。

是否有一种惯用的方案方法来处理我不知道的通用程序?

0 投票
1 回答
447 浏览

delphi - 如何检查 TypeIdenitifier(T) 是否为对象?

我正在创建一个具有 Array(Array of ) 类型成员的通用列表类。问题是类破坏,因为该类应该用于从字节到继承TObject的类型的类型。

具体来说:

例如,如果类型标识符是一个类,我如何检查 T 是否是 TObject 以便我可以释放每个成员?

0 投票
3 回答
324 浏览

c++ - C++、泛型编程和虚函数。我怎样才能得到我想要的?

这就是我想使用模板做的事情:

我想要一个简单地从提供这些方法声明的模板类派生的类,同时使它们成为虚拟的。这是我设法想出的:

但是,正如您可能已经猜到的那样,我无法覆盖我继承的 6 种方法中的任何一种。我显然在这里遗漏了一些东西。我的错误是什么?不,这不是家庭作业。这是好奇心。

0 投票
11 回答
19654 浏览

c++ - 使用模板有什么缺点?

一些缺点是

  1. 它的语法很复杂
  2. 编译器生成额外代码
0 投票
1 回答
232 浏览

delphi - 我的 OO 泛型设计中的错误。我该如何解决?

我在第三类得到“E2511 类型参数'T'必须是类类型” 。

我正在尝试为任何数据类型(ParentParentClass)编写一个精简的通用数组包装器,但是因为我无法释放类型标识符(如果 T 是 TObject 那么 Tobject(T).Free),我创建了第二个类,它对于类类型很有用,所以我可以释放对象。

第三类是我使用包装器的地方,但编译器会抛出该错误。我如何使它编译?

0 投票
1 回答
667 浏览

delphi - Delphi泛型中的多态性

g.test 必须返回该类的一个实例。我尝试了多种方法:

这样做的目的是创建一个通用的类数组。数组存储在泛型类中并返回实例,但如何?

如果我完成这件事,我会缩短我的代码 3 倍,但我做不到。请提出任何解决方案。

0 投票
2 回答
3232 浏览

c++ - 包含任意类型的任意 STL 容器的函数模板

我有一个任意 STL 容器 C,其中包含任意类型 T 的元素。我想创建一个 std::vector,它具有所有元素的副本。最干净的方法是什么?

0 投票
4 回答
972 浏览

c++ - 派生模板覆盖成员函数 C++ 的返回类型

我正在编写矩阵类。看看这个定义:

generic_square_matrix 类提供矩阵乘法等附加功能。这样做没有问题:

由于构造函数的原因,即使类型不是 generic_square_matrix,也可以将任何方阵分配给 M。这是可能的,因为数据不会跨子级更改,只会更改受支持的函数。这也是可能的:

相同的转换适用于此。但是现在问题来了:

为了解决这个问题,我希望 generic_square_matrix::minor 返回 generic_square_matrix 而不是 generic_matrix。我认为唯一可能的方法是使用模板专业化。但是由于专业化基本上被视为一个单独的类,所以我必须重新定义所有功能。我不能像调用派生类那样调用非专业类的函数,所以我必须复制整个函数。这不是一个很好的通用编程解决方案,而且需要大量工作。

C++ 几乎可以解决我的问题:派生类的虚函数可以返回与基类返回的不同类的指针或引用,如果这个类是从基类返回的类派生的。generic_square_matrix派生自 generic_matrix,但该函数不返回指针也不返回引用,因此此处不适用。

是否有解决此问题的方法(可能涉及完全不同的结构;我唯一的要求是尺寸是模板参数并且方阵可以具有附加功能)。

提前致谢,

路德

0 投票
4 回答
1231 浏览

c++ - 使用指针、引用、通用数据类型的句柄,尽可能通用和灵活

在我的应用程序中,我有很多不同的数据类型,例如 Car、Bicycle、Person、...(它们实际上是其他数据类型,但这只是示例)。

由于我的应用程序中也有相当多的“通用”代码,并且该应用程序最初是用 C 编写的,因此指向 Car、Bicycle、Person... 的指针通常作为 void 指针传递给这些通用模块,以及标识的类型,像这样:

'ShowNiceDialog' 方法现在使用元信息(将 DATATYPE_CAR 映射到接口以从 Car 中获取实际数据的函数)根据给定的数据类型获取汽车的信息。这样,通用逻辑只需编写一次,而不是每次都为每种新数据类型编写一次。

当然,在 C++ 中,您可以通过使用公共根类来简化此操作,如下所示

问题是,在某些情况下,我们不想将数据类型存储在一个类中,而是以完全不同的格式存储以节省内存。在某些情况下,我们需要在应用程序中管理数亿个实例,并且我们不想为每个实例创建一个完整的类。假设我们有一个具有 2 个特征的数据类型:

  • 一个数量(双精度,8 字节)
  • 一个布尔值(1 个字节)

虽然我们只需要 9 个字节来存储这些信息,但把它放在一个类中意味着我们至少需要 16 个字节(因为填充),而使用 v-pointer 我们甚至可能需要 24 个字节。对于数亿个实例,每个字节都很重要(我有一个 64 位的应用程序变体,在某些情况下它需要 6 GB 的内存)。

void-pointer 方法的优点是我们几乎可以在 void-pointer 中编码任何内容,并决定如果我们想要从中获取信息(将其用作真正的指针、索引等)如何使用它,但在类型安全的成本。

模板化解决方案无济于事,因为通用逻辑构成了应用程序的很大一部分,我们不想将所有这些都模板化。此外,数据模型可以在运行时扩展,这也意味着模板将无济于事。

有没有比空指针更好(和类型更安全)的方法来处理这个问题?有没有关于这方面的框架、白皮书、研究材料的参考?