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

3

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

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_Class 实例,还有一个 .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 是否可能突然表现出异常行为?
  • 有没有»适当»的方法来获取类名?

此外,这是最快的方法吗?我的意思是,所有类名似乎都以 classtype. 开头。噢,那可能是另一个 SO 线程了。再次感谢!

敬礼

1个回答

3
您可以使用可通过 .classinfo 属性访问的 ClassInfo 类来在运行时引用类类型。然而,ClassInfo 类没有实现必要的方法以在关联数组中使用(有关在 AAs 中使用类/结构的信息,请参见D 参考页面上的 AAs)。如果您实现自己的 ClassInfo 包装器并将其用作 AA 键,则可能是可能的。这应该很简单,因为您可以期望一个类类型只有一个 ClassInfo 实例,因此可以简单地使用 ClassInfo 的地址作为唯一哈希值。

顺便说一句,更简单、更快速的编写方式:

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

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

每个类只有一个classinfo:如果您使用DLL或SO,则可能不是真的。但在这些情况下,您也会遇到其他问题。 - BCS
谢谢!我最终使用了classinfo中的.name属性,它只是一个字符串,因此在关联数组中使用没有问题,虽然感觉可能会更快。/BR - 0scar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接