有没有办法在编译时(或运行时以恒定时间)创建一个包含序数类型 T
成员的集合,其中包含 的每个命名值>T
?
换句话说,我如何补充特定类型的空集?
type
TEnum =
(
eA = 1,
eB = 5,
eC = 34
);
TSet = set of TEnum;
const
CSet: TSet = ~[]; // with ~ being my fictional set complement operator
那么CSet
应该只包含命名值eA
、eB
和eC
.
当然这不是一个实际问题,我只是好奇
<小时/>编辑
我没有意识到使用显式的非连续值声明时枚举类型的行为。该枚举仍然包含未命名的成员来填补空白。更新了问题以仅适用于指定成员
最佳答案
对于没有指定值的枚举来说非常容易,例如
type
TEnum =
(
eA,
eB,
eC
);
TSet = set of TEnum;
const
CSet: TSet = [eA..eC];
CSet: TSet = [low(TEnum)..high(TEnum)];
<小时/>
但是,您的 TEnum
定义为
type
TEnum =
(
eA = 1,
eB = 5,
eC = 34
);
上面的方法不会按您期望的方式工作。在您的情况下,CSet
将包含低枚举值和高枚举值(1 到 34)之间的所有数值。
仅获取已明确命名的 TEnum
值的唯一方法是使用 CSet: TSet = [eA, eB, eC];
这是设计使然,如 Simple Types 中所述。
关于delphi - 创建一个包含每个成员的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680589/