Гетерогенный контейнер для D - PullRequest
7 голосов
/ 24 апреля 2011

Поддерживает ли D гетерогенные контейнеры (т. Е. Массив, который содержит разные типы)?

Я знаю о кортежах, но ограничение не быть «возвращаемым» из функций просто убивает цель, которую я имею в виду.

Ответы [ 3 ]

7 голосов
/ 24 апреля 2011

Я предполагаю, что вы используете 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) в качестве его типа.

Если вы действительно хотите список вещей, которые вы не хотитезнать тип во время компиляции import std.variant и затем Variant[] как список этих вещей.

5 голосов
/ 25 апреля 2011

Variant [] и variableArray () выполнят эту работу, вот несколько примеров

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 голосов
/ 27 апреля 2011

Я добавлю это для полноты.

Я только что узнал о boxArray (в std.boxer), это также может быть решением.

...