2010-10-06 33 views

Répondre

8

Une alternative en plus d'utiliser le pointeur de style C Arithmétique est à le modèle safe_data, à savoir faire quelque chose comme ça :

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); 
} 

Selon ce que vous voulez faire avec les données, vous pouvez utiliser ref plutôt sur in. BTW, si vous préférez, vous pouvez déplacer le static if en dehors de la fonction qui rend le code plus propre parfois:

// 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

Juste ce que je cherchais! Je ne comprends pas bien les modèles mais votre exemple est très élucidatoire. –

+0

@Pedro: vous êtes les bienvenus. Si vous souhaitez sérialiser des données, Orange (http://www.dsource.org/projects/orange) peut être intéressant. – stephan