我已经开始从枚举中选择随机值,如下所示:
import std.random : uniform;
import std.stdio : writefln;
import std.conv;
enum E {A, B, C}
int main(){
auto select = cast(E)uniform(to!int(E.min), to!int(E.max));
writefln("select %s", select);
return 0;
}
这非常冗长,如果任何枚举成员的值超出默认值(或大于int
),则容易出现问题。
理想情况下,我会采用一个代表枚举元素的范围,并将其提供给randomSample
. 然而,这似乎是不可能的。
有没有更惯用的方法从 D 中的枚举中选择一个随机值?
编辑:
使用 fwend 提供的答案,这是一个实现我想要的模板函数:
T RandomEnumElement(T)() if (is(T == enum)){
auto members = [EnumMembers!T];
return members[(uniform(0, members.length))];
}