8
不知道是否有可能,我想收到也許data[n]
或data[n][n][n]
。在C可能是(如果錯了指正):在D函數中接收數組的數組?
void save_data(void* arr, int n, int dimensions)
{
// do ugly things
}
但必須存在一個更優雅的方式D.
不知道是否有可能,我想收到也許data[n]
或data[n][n][n]
。在C可能是(如果錯了指正):在D函數中接收數組的數組?
void save_data(void* arr, int n, int dimensions)
{
// do ugly things
}
但必須存在一個更優雅的方式D.
一種選擇,除了用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);
}
根據你想用數據做什麼,你可能想在in
使用ref
代替。順便說一句,如果你願意,你可以移動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
}
正是我在找什麼!我不明白好的模板,但你的例子是非常明確的。 – 2010-10-06 07:03:47
@佩德羅:不客氣。如果你想序列化數據,Orange(http://www.dsource.org/projects/orange)可能值得一看。 – stephan 2010-10-06 07:38:59