我希望能夠創建一個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
重新每類只含有一個CLASSINFO:IIRC如果你正在使用的可能不是真的DLL或SOs。但在這些情況下,您最終還會遇到其他問題。 – BCS 2010-07-02 03:08:01
謝謝!我結束了使用'。nameinfo屬性,它只是一個字符串,所以在關聯數組中使用沒有問題,儘管感覺它可能更快。/BR – 0scar 2010-07-02 12:57:02