Получать массивы массивов из ... в функции D? - PullRequest
8 голосов
/ 06 октября 2010

Не знаю, возможно ли это, я хочу получить, может быть, data[n] или data[n][n][n]. В Си может быть (поправьте меня, если не прав):


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

Но должен существовать более элегантный способ в D.

1 Ответ

8 голосов
/ 06 октября 2010

Одной альтернативой, кроме использования арифметики указателей в стиле 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);
}

В зависимости от того, что вы хотите сделать с данными, вы можете использовать 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
}
...