Una alternativa además de usar la aritmética de puntero estilo C es a la plantilla safe_data
, es decir, hacer algo como esto :
import std.stdio;
import std.traits;
void safe_data(T)(in T arr) {
static if(isArray!T) {
writeln("Length ", arr.length); // do some ugly stuff for whole array
foreach(e; arr) safe_data(e); // recursively go deeper
} else {
writeln("Element ", arr); // do more ugly stuff on individual elements
}
}
void main() {
writeln("A");
int[3] A = [1,2,3];
safe_data(A);
writeln("B");
int[3][2] B = [[1,2,3],[4,5,6]];
safe_data(B);
}
Dependiendo de lo que quiere hacer con los datos, es posible que desee utilizar ref
en cambio en in
. Por cierto, si lo prefiere, puede mover el exterior static if
de la función que lo convierte en un código más limpio veces:
// handle arrays
void safe_data(T)(in T arr) if(isArray!T) {
writeln("Length ", arr.length); // do some ugly stuff for whole array
foreach(e; arr) safe_data(e); // recursively go deeper
}
// handle array elements
void safe_data(T)(in T e) if(!isArray!T) {
writeln("Element ", e); // do more ugly stuff on individual elements
}
Justo lo que estaba buscando! No entiendo bien las plantillas, pero su ejemplo es muy elucidatorio. –
@Pedro: de nada. Si desea serializar datos, puede valer la pena visitar Orange (http://www.dsource.org/projects/orange). – stephan