gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:43:06 25 4
gpt4 key购买 nike

我有一堂这样的课:

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);

Thorsten 的答案为您提供了一个类函数,但在注释中您声明您正在寻找一个普通的成员函数。

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 中,您究竟如何才能用它做任何非常有用的事情,如果没有通用的解决方案,就无法有效地完成这些事情。

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

关于delphi - 如何声明基于泛型类型的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5344433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com