如何声明基于泛型类型的指针?

2024-03-13

我有一堂这样的课:

type A = class
    procedure<T> DoStuff(tPtr: ^T);
end;

但是当我尝试编译时,Delphi 给出了这个错误:

[DCC Error] RPML.pas(57): E2029 Identifier expected but '^' found

如何在 Delphi 过程中使用指向参数化类型的指针?我不想让整个类成为模板类。


为此,您需要将指针类型声明为泛型类中的嵌套类型:

type 
  TMyGeneric<T> = class
  type
    P = ^T;
  public
    procedure DoStuff(tPtr: P);
  end;

如果您想要一个类方法(即不是实例方法),您可以这样做:

type
  TMyGeneric<T> = record
  type
    P = ^T;
  public
    class procedure DoStuff(tPtr: P); static;
  end;

var
  int: Integer;
...
TMyGeneric<Integer>.DoStuff(@int);

或者使用 var 参数:

type
  TMyGeneric<T> = record
  public
    class procedure DoStuff(var a: T); static;
  end;

对于从未实例化的泛型类型,使用记录而不是类似乎很常见。

最后,在 Delphi 中,如果不使类通用,就不能拥有通用方法。换句话说,没有与以下 C++ 模板代码类似的内容:

Thorsten 的答案展示了如何实现通用方法而不使类通用,即以下 C++ 模板代码的 Delphi 类似物:

class C {
public:
   template <typename T>
   int SomeTemplateFunction(T* data) {
      printf("Address of parameter is %p\n", data);
      return 0;
   }
};

int a; 
char c; 
C cinst; 
cinst.SomeTemplateFunction<int>(&a); 
cinst.SomeTemplateFunction<char>(&c);

托尔斯滕的答案为您提供了一个类函数,但在评论中您声明您正在寻找一个普通的成员函数。

type
  TMyClass = class
  public
    procedure DoStuff<T>(var a: T);
  end;

procedure TMyClass.DoStuff<T>(var a: T);
begin
end;

...
var
  instance: TMyClass;
  i: Integer;
  s: string;
...
  instance.DoStuff<Integer>(i);
  instance.DoStuff<string>(s);

然而,我正在努力解决的是,在 Delphi 中,您究竟如何能够用它来做任何非常有用的事情,如果没有通用的解决方案,就无法有效地完成这些事情。

我很感激任何建议,并很乐意编辑答案以适应它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何声明基于泛型类型的指针? 的相关文章

随机推荐

  • 如何在 PHP 中创建循环模板

    我们可以在 C 中定义循环模板 以缩短编码时间 define fo a b c for a b a lt c a 有没有办法在 PHP 中做同样的事情 幸好没有 有很多可怕的事情可以使 PHP 变得不可读 但这不是其中之一 PHP 默认不使
  • Azure Cosmos 分页:FeedResponse.ContinuationToken 在下一个请求中不起作用

    下面是我在 Azure Cosmos 中进行分页的代码 在该函数中 我返回 FeedResponse 的 ContinuationToken 获取第一页的第一个请求很好 它返回继续令牌 但是 如果我在下一个请求中使用该令牌 则 API 将返
  • delphi程序中的隐藏主菜单,使用Alt键自动显示

    首先 我要说的是 我讨厌Windows Vista和Windows 7中的这个功能 其次 我想做它 Here https stackoverflow com questions 1218394 how can i toggle the ma
  • TypeScript 和 RegExp

    打字稿 说 该物业 1 类型值不存在 pattern string flags string RegExp new pattern string flags string RegExp 该类型可以通过查看定义来解释lib d ts附带的打字
  • 除了IEEE754之外还有其他常用的浮点格式吗?

    我正在编写一个编组层来自动转换不同域之间的值 当涉及浮点值时 这可能意味着将值从一种浮点格式转换为另一种浮点格式 然而 似乎几乎每个现代系统都在使用 IEEE754 所以我想知道是否真的值得推广以允许其他格式 或者只是管理不同 IEEE75
  • 形式中的形式。表单控件可以继承吗?

    我有两个组件 ParentComponent 和 ChildComponent 父组件 ts
  • UiAutomator -- 将小部件添加到主屏幕

    我对 Google 的 uiautomator 有相当多的经验 然而 当谈到向手机主屏幕添加小部件时 我似乎被难住了 现在让我们保持简单并假设要添加小部件的屏幕是空的 思考过程是打开应用程序抽屉 gt 单击小部件选项卡 gt 找到要添加的小
  • 背景图像的全宽和全高

    我正在为一个网站设置横幅 横幅由图像和其顶部的一些文本组成 代码如下 div class banner div p class banner text Line 1Line 2 p div 我需要的是图像覆盖屏幕的整个宽度 即使屏幕比图像宽
  • Web 应用程序架构:1 个或 n 个 API

    背景 我正在考虑网络应用程序组织 我将前端 浏览器网站 与后端 API 分开 2 个应用程序 2 个存储库 2 个托管 Front 几乎会调用 API 来完成所有事情 因此 如果我的 API 有两个独立的域服务 例如 学习上下文和预订上下文
  • group by 之后的拉丁猪袋到元组

    我有以下带有架构的数据 t0 chararray t1 int t2 int B 4 2 A 2 3 A 3 2 B 2 2 A 1 2 B 1 2 我想生成以下结果 按 t0 分组 并按 t1 排序 A 1 2 2 3 3 2 B 1 2
  • 文件上传 ['ERROR']= 2 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我不断收到
  • 获取字符串中的第一个单词[重复]

    这个问题在这里已经有答案了 我想从向量中提取第一个字符串 例如 y lt c london hilss newyork hills paris jjk 我想获取符号 之前的字符串 即 location london newyork pari
  • 设置Android布局元素的背景颜色

    我正在尝试在某种程度上克隆活动的设计 然而 我在一项非常简单的任务上遇到了问题 我已经创建了如图所示的布局 标题是TextView in a RelativeLayout 现在我想改变背景颜色RelativeLayout 但我似乎无法弄清楚
  • 如何更改 xib 中的占位符文本颜色?

    如何更改 xib 中的占位符文本颜色 我已经尝试过关键路径的事情 但它给了我 NSException 任何人都可以帮忙吗 修改占位符文本颜色的最简单方法是通过 Xcode Storyboard 界面生成器 选择感兴趣的 UITextFiel
  • 为什么匿名类不能有 lambda 属性,但可以有 Func<> 属性? [复制]

    这个问题在这里已经有答案了 我正在尝试了解 C 对匿名类型的限制 考虑以下代码 var myAwesomeObject new fn1 new Func
  • 如何创建由两种颜色并排组成的android可绘制对象?

    使用 XML 是否可以创建一个可绘制对象 其中一半为 color1 另一半为 color2 当我将该可绘制对象设置为视图的背景时 它应该如下图所示 通过xml来做
  • 有什么办法可以配置Struts绑定null而不是空字符串吗?

    当用户决定将表单中的字段保留为空时 Apache Struts 会绑定为空String作为属性的值ActionForm 有什么方法可以全局修改行为并选择null而不是空的String 我知道 Spring MVC 的做法完全相同 但还有字符
  • PhoneGap 相机在捕获图像后无法确认

    我正在制作一个应用程序来测试 PhoneGap 的功能 以便稍后我可以将其用于更大的项目 我试图通过构建一个简单的测试应用程序来让相机 API 正常工作 该应用程序仅捕获并显示图像 奇怪的是 当我按下捕获按钮时会触发navigate cam
  • Scala 中的高效字符串连接

    JVM 通过以下方式优化字符串连接 并将其替换为StringBuilder 这在 Scala 中应该是一样的 但是如果字符串连接起来会发生什么 var x x x y x z 据我所知 该方法将字符串视为字符序列 因此即使 JVM 可以创建
  • 如何声明基于泛型类型的指针?

    我有一堂这样的课 type A class procedure