ho preso a selezionare valori casuali da enumerazioni modo:Selezionare un elemento casuale di un'enumerazione in D
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;
}
Questo è sorprendentemente dettagliato, e soggetto a problemi se qualche membro enum assumono valori al di fuori del difetto (o superiore a int
).
Idealmente vorrei prendere un intervallo che rappresenta gli elementi dell'enumerazione e fornire questo a randomSample
. Tuttavia, questo non sembra essere possibile.
Esiste un modo più idiomatico per selezionare un valore casuale da un enum in D?
EDIT:
Utilizzando la risposta fornita da fwend, ecco un modello di funzione che consente di ottenere quello che voglio:
T RandomEnumElement(T)() if (is(T == enum)){
auto members = [EnumMembers!T];
return members[(uniform(0, members.length))];
}
Attualmente la modifica non viene compilata, 'Evalue' ha bisogno di tipo 'E []'. – cmh
@cmh Strano, compila bene con me. dmd 2.060 win7 – fwend
Scusa funziona, ha bisogno dell'argomento quando si trova all'interno di una funzione template. – cmh