作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用泛型将一组字节转换为枚举集。但代码无法编译。 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/
我是一名优秀的程序员,十分优秀!