gpt4 book ai didi

delphi - 如何使用泛型处理集合

转载 作者:行者123 更新时间:2023-12-02 15:49:30 27 4
gpt4 key购买 nike

我正在尝试使用泛型将一组字节转换为枚举集。但代码无法编译。 TValue.FromOrdinal(TypeInfo(T), Ord(B)).AsType 实际上正确返回了枚举值,但我无法将此值包含在枚举集中。

interface 

type TByteSet = set of Byte;
type TMyNewEnum = (meZero, meOne, meTwo);
type TMyNewEnumSet = set of TMyNewEnum;

type
TEnum<T> = class(TObject)
public
class function ToString(const aEnumValue: T): string; reintroduce;
class function FromString(const aEnumString: string; const aDefault: T): T;
class procedure FromByteSet(const Value: TByteSet; out EnumSet: TMyNewEnumSet);
end

implementation
Var
MyByteSet: TMyByteSet;
MyEnumSet: TMyNewEnumSet;
...
class procedure TEnum<T>.FromByteSet(const Value: TByteSet; out EnumSet: TMyNewEnumSet);
var
B: Byte;
begin
Assert(PTypeInfo(TypeInfo(T)).Kind = tkEnumeration, 'Type parameter must be an Enumeration');
for B in Value do
begin
EnumSet := EnumSet + TValue.FromOrdinal(TypeInfo(T), Ord(B)).AsType<T>; //This line does not compile
end;
end;
...



//intended Usage
MyByteSet := [0, 2];
TEnum<TMyNewEnum>.FromByteSet(MyByteSet, MyEnumSet);
//I would like MyEnumSet to contain [meZero, meTwo]

end.

有什么想法吗?

最佳答案

您正在尝试的事情是不可能的。为了使其成为可能,您需要能够将泛型类型参数限制为可以形成集合的类型。但该语言不支持此类通用约束。

事实上,您现有的代码已经包含了根本问题的迹象。你有:

type
TEnum<T> = class(TObject)
public
class procedure FromByteSet(const Value: TByteSet; out EnumSet: TMyNewEnumSet);
end;

房间里的大象是 FromByteSet 没有引用 T,因此不是通用的。

为了使函数通用,您需要这样的东西:

type
TEnum<T: record> = class(TObject)
private
type SetOfT = set of T;
public
class procedure FromByteSet(const Value: TByteSet; out EnumSet: SetOfT);
end;

这不能编译。编译器反对类型声明:

[dcc32 Error]: E2001 Ordinal type required

这是因为编译器无法确定 T 是序数类型。为此,由于 T 是泛型类型参数,因此您需要施加一个泛型约束,即 T 是序数类型。但该语言不支持这样的约束。

关于delphi - 如何使用泛型处理集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53266055/

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