2011-04-24 3 views
7

D는 이기종 컨테이너 (즉, 다른 유형을 보유하고있는 배열)를 지원합니까?D를위한 이기종 컨테이너

필자는 튜플에 대해 알고 있지만 함수에서 "반환 할 수 없다"는 제한은 내가 염두에두고있는 목적을 없앤다.

+2

튜플은 반환 할 수 있습니다. 유형 튜플이 아닙니다. 그들은 조금 다릅니다. – Mehrdad

답변

7

D1에 대해 잘 모르기 때문에 D2를 사용한다고 가정합니다.

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

는 변형 []와 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

입니다.

방금 ​​boxArray (std.boxer에서)에 대해 알아 냈습니다. 해결책 일 수도 있습니다.

+2

std.boxer : "이 모듈은 단계적으로 제거되고 있습니다. 새 코드에 std.variant를 사용하고 싶을 수도 있습니다." – fwend