Class 关联数组,其中类TypeInfo是D中的键?

Class 关联数组,其中类TypeInfo是D中的键?,class,d,associative-array,Class,D,Associative Array,我希望能够创建一个多维关联数组,其中一维是一个类。像这样: 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

我希望能够创建一个多维关联数组,其中一维是一个类。像这样:

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
在本例中是一个类。)

[更新/解决方案]

谢谢你的回答

我想公布结果会很好。好的,我在源代码中查找了
.classinfo
,发现它返回一个TypeInfo\u类的实例,并且有一个
.name
-属性,一个
字符串。这就是我想到的:

#!/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
所以,是的,我想它起作用了。是的!有人有改进的想法吗

这里有什么陷阱吗

  • classinfo.name
    是否会突然出现异常行为
  • 是否有一种»正确»的方式获取类名
还有,这是最快的方法吗?我的意思是,所有的类名似乎都以
类类型开头。
。哦,好吧,那也许是另一条线索。再次感谢

BR

您可以在运行时使用类(可通过
.classinfo
属性访问)引用类类型。但是,
ClassInfo
类没有实现在关联数组中使用的必要方法(请参阅关于在AAs中使用类/结构的说明)。我认为,如果您实现自己的ClassInfo包装器,并将其用作AA密钥,这是可能的。这应该相当简单,因为您可以预期一个类类型将只有一个ClassInfo实例,因此您可以简单地使用ClassInfo的地址作为唯一哈希


顺便说一句,一种更简单、更快的写作方式

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


如果您使用DLL或SOs,那么每个类只有一个classinfo:IIRC,这可能不是真的。但在这种情况下,你也会遇到其他问题。谢谢!最后,我在classinfo中使用了
.name
-属性,它只是一个字符串,所以在关联数组中使用它没有问题,尽管感觉它可能更快/溴
auto pvalue = key in aa;
return pvalue ? *pvalue : null;