Arrays D的异构容器

Arrays D的异构容器,arrays,d,Arrays,D,D是否支持异构容器(即包含不同类型的数组) 我知道元组,但不能从函数“返回”的限制扼杀了我的目的。我假设您使用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() { au

D是否支持异构容器(即包含不同类型的数组)


我知道元组,但不能从函数“返回”的限制扼杀了我的目的。

我假设您使用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
}
使用
元组(v1,v2)
作为值,使用
元组!(T1,T2)
按其类型

如果您确实想要一个编译时不知道类型的列表,请导入
std.variant
,然后将
variant[]
作为这些内容的列表。

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[]
}

为了完整性,我将添加这个


我刚刚了解到boxArray(在std.boxer中),这可能也是一个解决方案。

元组是可返回的。类型元组不是;他们有点不同。std.boxer:“这个模块正在被淘汰。你可能想在新代码中使用std.variant。”