D是否支持异构容器(即包含不同类型的数组)?
我知道元组,但是不能从函数中“返回”的限制只会破坏我的目的。
答案 0 :(得分:7)
我假设您使用D2,因为我不知道D1。
在std.typecons
中有tuple
和Tuple
,它们允许您使用这些“不可返回”的编译时元组来创建运行时值。
import std.typecons, std.stdio;
Tuple!(int, string, int[]) f() {
return tuple(5, "xyz", [3, 4, 5]);
}
void main() {
auto x = f();
writefln("%s is %s", x[1], x[0]);
//indices have to be copile-time constants
}
使用tuple(v1, v2)
作为值,Tuple!(T1, T2)
作为类型。
如果你真的想要一个在编译时你不知道类型的东西的列表导入std.variant
然后Variant[]
作为这些东西的列表。
答案 1 :(得分:5)
Variant []和variantArray()可以完成这项工作,这里有一些例子
module test;
import std.variant, std.stdio;
Variant[] f() {
return variantArray(5, "xyz", [3, 4, 5]);
}
void main() {
auto x = f();
writeln(x); // [5, xyz, [3, 4, 5]]
writefln("%s is %s", x[1], x[0]); // xyz is 5
x ~= Variant(890);
string s = "abc";
x ~= Variant(s);
class C {};
x ~= Variant(new C());
x ~= Variant(new int[2]);
x[$-1][0] = 5;
foreach (e; x) {
write(e, " "); // 5 xyz [3, 4, 5] 890 abc test.main.C [5, 0]
}
f2(x);
Variant[] a = variantArray("23", 23);
Variant[] b = new Variant[3];
Variant[] c = [Variant(12), Variant("a")];
}
void f2(Variant[] va) {
writeln(typeid(va)); // std.variant.VariantN!(maxSize).VariantN[]
}
答案 2 :(得分:0)
为了完整起见,我会加上这个。
我刚刚发现了关于boxArray(在std.boxer中),这也可能是一个解决方案。