2010-10-06 10 views

Respuesta

8

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 
} 
+0

Justo lo que estaba buscando! No entiendo bien las plantillas, pero su ejemplo es muy elucidatorio. –

+0

@Pedro: de nada. Si desea serializar datos, puede valer la pena visitar Orange (http://www.dsource.org/projects/orange). – stephan

Cuestiones relacionadas