D是否支持异构容器(即包含不同类型的数组)?
我知道元组,但是函数不能“返回”的限制正好扼杀了我想要的目的。
发布于 2011-04-24 18:33:50
我假设你使用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[]作为这些东西的列表。
发布于 2011-04-25 16:38:56
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[]
}发布于 2011-04-27 06:35:31
为了完整起见,我将添加以下内容。
我刚刚发现了boxArray(在std.boxer中),这也可能是一个解决方案。
https://stackoverflow.com/questions/5769922
复制相似问题