he llevado a la selección de valores aleatorios a partir de las enumeraciones de este modo:Seleccionar un elemento aleatorio de una enumeración en 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;
}
Esto es sorprendentemente detallado y propensos a problemas si algún miembro de enumeración toman valores fuera del defecto (o mayor que int
).
Lo ideal sería tomar un rango que representa los elementos de la enumeración, y proporcionar esto a randomSample
. Sin embargo, esto no parece ser posible.
¿Hay alguna forma más idiomática de seleccionar un valor aleatorio de una enumeración en D?
EDIT:
Usando la respuesta proporcionada por fwend, aquí es una función de plantilla que logra lo que quiero:
T RandomEnumElement(T)() if (is(T == enum)){
auto members = [EnumMembers!T];
return members[(uniform(0, members.length))];
}
Actualmente la edición no compila, las necesidades de 'Evalues 'teclean' E [] '. – cmh
@cmh Extraño, compila muy bien conmigo. dmd 2.060 win7 – fwend
Disculpa, funciona, necesita el argumento cuando está dentro de una función de plantilla. – cmh