我希望能够创建一个多维关联数组,其中一个维度是一个类。像这样:
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
[更新/分辨率]
感谢您的回答!
我认为发布结果会很好。好的,我在源代码中查找.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
答案 0 :(得分:3)
您可以使用ClassInfo类(可通过.classinfo
属性访问)在运行时引用类类型。但是,ClassInfo
类没有实现在关联数组中使用的必要方法(请参阅D reference page on AAs关于在AA中使用类/结构)。我想如果你为ClassInfo实现自己的包装器可以用作AA键,这是可能的。这应该相当简单,因为您可以预期类类型只有一个ClassInfo实例,因此您可以简单地使用ClassInfo的地址作为唯一的哈希。
顺便说一下,写一个更简单,更快捷的方式
if (key in aa)
return aa[key];
else
return null;
是
auto pvalue = key in aa;
return pvalue ? *pvalue : null;