2010-10-06 27 views
8

Không biết nếu có thể, tôi muốn nhận được data[n] hoặc data[n][n][n]. Trong C có thể là (đúng cho tôi nếu sai):Nhận mảng các mảng ... trong hàm D?


void save_data(void* arr, int n, int dimensions) 
{ 
    // do ugly things 
} 

Nhưng phải tồn tại một cách thanh lịch hơn trong D.

Trả lời

8

Một thay thế bên cạnh việc sử dụng C con trỏ kiểu arithmetics là template safe_data, tức là làm một cái gì đó như thế này :

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

Tùy thuộc vào những gì bạn muốn làm gì với dữ liệu, bạn có thể muốn sử dụng ref thay vì trên in. BTW, nếu bạn thích, bạn có thể di chuyển các static if bên ngoài của chức năng mà làm cho mã sạch hơn đôi khi:

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

Chỉ cần những gì tôi đang tìm kiếm! Tôi không hiểu rõ các mẫu nhưng ví dụ của bạn rất rõ ràng. –

+0

@Pedro: bạn được chào đón. Nếu bạn muốn tuần tự hóa dữ liệu, Orange (http://www.dsource.org/projects/orange) có thể đáng xem. – stephan

Các vấn đề liên quan