异构容器适用于D语言

7

D语言支持异构容器吗(例如,可以容纳不同类型的数组)?

我知道元组,但其无法从函数中“返回”这一限制完全破坏了我想要实现的目的。


2
元组是可返回的。类型元组不是;它们有点不同。 - user541686
3个回答

7

我假设你使用D2,因为我不了解D1。

std.typecons中有tupleTuple,它们允许您使用这些“非可返回”的编译时元组来创建运行时值。

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[]作为这些事物的列表。


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

0

我将为了完整性而添加这个。

我刚刚发现了std.boxer中的boxArray,这也可能是一个解决方案。


2
std.boxer:“该模块正在逐步淘汰。您可能希望在新代码中使用std.variant。” - fwend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接