2010-07-01 58 views
3

我希望能夠創建一個multidim關聯數組,其中一個維度是一個類。就像這樣:關聯數組的哪個類TypeInfo在D中是關鍵?

class Node{ 
    Node[?classType?][string] inputs; 
} 

,這樣我以後可以做

Node[] getInputsOfType(?? aClass){ 
    if(aClass in this.inputs) 
     return this.inputs[aClass]; 
    else 
     return null; 
} 

// meanwhile in another file... 

Node[] effects = someAudioNode.getInputsOfType(AudioEffect); 

我只是失去了。有任何想法嗎?
關於最後的部分:一個類可以像這樣一個參數嗎? (AudioEffect在這個例子中是一類。)

BR

[更新/分辨率]

謝謝你的答案(S)!

我認爲這將是很好的發佈結果。好的,我在源代碼中查找.classinfo,發現它返回一個TypeInfo_Class實例,並且有一個.name屬性,一個string。所以這就是我想出了:

#!/usr/bin/env dmd -run 
import std.stdio; 
class A{ 
    int id; 
    static int newId; 
    A[string][string] list; 
    this(){ id = newId++; } 
    void add(A a, string name){ 
     writefln("Adding: [%s][%s]", a.classinfo.name, name); 
     list[a.classinfo.name][name] = a; 
    } 
    T[string] getAllOf(T)(){ 
     return cast(T[string]) list[T.classinfo.name]; 
    } 
} 
class B : A{ } 
void main(){ 
    auto a = new A(); 
    a.add(new A(), "test"); 
    a.add(new B(), "bclass"); 
    a.add(new B(), "bclass2"); 

    auto myAList = a.getAllOf!(A); 
    foreach(key, item; myAList) 
     writefln("k: %s, i: %s id: %s", 
       key, item.toString(), item.id); 

    auto myBList = a.getAllOf!(B); 
    foreach(key, item; myBList) 
     writefln("k: %s, i: %s id: %s", 
       key, item.toString(), item.id); 
} 

它輸出:

Adding: [classtype.A][test] 
Adding: [classtype.B][bclass] 
Adding: [classtype.B][bclass2] 
Trying to get [classtype.A] 
k: test, i: classtype.A id: 1 
Trying to get [classtype.B] 
k: bclass2, i: classtype.B id: 3 
k: bclass, i: classtype.B id: 2 

所以,是的,我想它的工作原理。 Yey!任何人都有改進的想法?

這裏有什麼隱患嗎?

  • classinfo.name可以突然表現不明顯嗎?
  • 有沒有一個合適的方法來獲取類名?

此外,這是做到這一點的最快方式?我的意思是,所有的類名似乎都以classtype.開頭。哦,那可能是另一個SO線程。再次感謝!

BR

回答

3

可以使用ClassInfo類(通過.classinfo屬性訪問)來引用類類型在運行時。但是,ClassInfo類未實現在關聯數組中使用的必要方法(有關在AAs中使用類/結構的信息,請參見D reference page on AAs)。我想這是可能的,如果你實現你自己的包裝可以用作AA密鑰的ClassInfo。這應該相當簡單,因爲您可以期望類類型只有一個ClassInfo實例,因此您可以簡單地使用ClassInfo的地址作爲唯一的哈希。


順便說一句,一個簡單和快速的方式來寫

if (key in aa) 
    return aa[key]; 
else 
    return null; 

auto pvalue = key in aa; 
return pvalue ? *pvalue : null; 
+0

重新每類只含有一個CLASSINFO:IIRC如果你正在使用的可能不是真的DLL或SOs。但在這些情況下,您最終還會遇到其他問題。 – BCS 2010-07-02 03:08:01

+0

謝謝!我結束了使用'。nameinfo屬性,它只是一個字符串,所以在關聯數組中使用沒有問題,儘管感覺它可能更快。/BR – 0scar 2010-07-02 12:57:02