在D函数中接收...数组的数组?

Ped*_*rda 8 arrays d

不知道是否是可能的,我想收到也许data[n]还是data[n][n][n].在C可以(如果错误,纠正我):


void save_data(void* arr, int n, int dimensions)
{
    // do ugly things
}
Run Code Online (Sandbox Code Playgroud)

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

ste*_*han 8

除了使用C风格指针算术之外,另一种选择是模板safe_data,即执行以下操作:

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);
}
Run Code Online (Sandbox Code Playgroud)

根据您对数据的处理方式,您可能希望ref改用in.顺便说一句,如果你愿意,你可以移动static 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
}
Run Code Online (Sandbox Code Playgroud)