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

标签 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...

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

我只是迷路了。有什么想法吗?
关于最后一部分:一个类可以像那样单独用作参数吗? (本例中的 AudioEffect 是一个类。)

BR

[更新/解决]

感谢您的回答!

我认为发布结果会很好。好的,我在源代码中查看了.classinfo,发现它返回了一个TypeInfo_Class的实例,并且有一个.name-property,一个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

是的,我想它是可行的。耶!有人有改进的想法吗?

这里有什么陷阱吗?

  • classinfo.name 会突然出现异常吗?
  • 是否有 »正确» 获取类名的方法?

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

BR

最佳答案

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


顺便提一下更简单快捷的写法

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

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

关于class - 关联数组,其中类 TypeInfo 是 D 中的关键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3161994/

相关文章:

curl - DMD 的 "curl.lib"在哪里?

PHP数组,使用 'depth'的键将数组项的深度递归地添加到数组中

linker - 通过LD链接D程序时 undefined symbol "start"

templates - D 中的结构体和元组模板参数

php - 使用PHP的关联数组的一行总和?

php - 如何在 JavaScript 中使用 PHP 变量?

python - 确定 jitclass 方法的输入参数类型

python - 为什么 type(classInstance) 返回 'instance' ?

java - Java 中的类和继承——我做错了什么?

c++ - 在运行时反复使用和对象的最佳实践是什么