Arrays 接收。。。在D函数中?

Arrays 接收。。。在D函数中?,arrays,d,Arrays,D,不知道是否可能,我想接收可能数据[n]或数据[n][n][n]。在C中可以是(如果错误,请纠正我): 但在D中必须存在一种更优雅的方式。除了使用C风格的指针算法之外,还有一种替代方法是模板化安全的\u数据,即执行以下操作: import std.stdio; import std.traits; void safe_data(T)(in T arr) { static if(isArray!T) { writeln("Length ", arr.length); //

不知道是否可能,我想接收可能
数据[n]
数据[n][n][n]
。在C中可以是(如果错误,请纠正我):


但在D中必须存在一种更优雅的方式。

除了使用C风格的指针算法之外,还有一种替代方法是模板化
安全的\u数据,即执行以下操作:

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);
}
根据您想对数据执行的操作,您可能希望在
中的
上使用
ref
。顺便说一句,如果您愿意,您可以将
静态if
移动到函数之外,这有时会使代码更干净:

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

这正是我要找的!我不太懂模板,但你的例子很清楚。@Pedro:不客气。如果您想序列化数据,Orange()可能值得一看。
// 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
}