Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates Dlang:如何处理各种类型的数组_Templates_Generics_Delegates_D - Fatal编程技术网

Templates Dlang:如何处理各种类型的数组

Templates Dlang:如何处理各种类型的数组,templates,generics,delegates,d,Templates,Generics,Delegates,D,我在学习D,我在玩处理泛型类型的方法。在D中,如何声明可以存储具有不同输入参数的委托的数组 在本例中,我试图部分模仿JavaScript使用.addEventListener/.dispatchEvent的方式,为此,我需要存储一个侦听器数组,其中包含各种事件类型作为输入参数。我试图阻止很多类型的来回转换,但是我被困在了需要将它们存储在同一个数组中的位置 import std.stdio; class Event { } class NewEvent : Ev

我在学习D,我在玩处理泛型类型的方法。在D中,如何声明可以存储具有不同输入参数的委托的数组

在本例中,我试图部分模仿JavaScript使用.addEventListener/.dispatchEvent的方式,为此,我需要存储一个侦听器数组,其中包含各种事件类型作为输入参数。我试图阻止很多类型的来回转换,但是我被困在了需要将它们存储在同一个数组中的位置

    import std.stdio;

    class Event {
    }

    class NewEvent : Event {
    }

    class EventTarget {
        void addEventListener(T)(void delegate(T) listener) {
            this.listeners ~ listener;
        }

        void dispatchEvent(T)(T event) {
            foreach (listener; this.listeners) {
                writeln("listener: ", listener, " ", event);
                // TODO: call listener if it's input argument matches the T type
                // if (type is the one matching the listeners first input argument) {
                //  listener(event);
                // }
            }
        }

    private:
        // TODO: find a way to store multiple event types in this array
        void delegate(T)[] listeners;
    }

    void main() {
        auto target = new EventTarget();

        target.addEventListener((NewEvent event) {
            write("executed handler for NewEvent", event);
        });

        target.addEventListener((Event event) {
            write("executed handler for Event", event);
        });

        target.dispatchEvent(new NewEvent());
        target.dispatchEvent(new Event());
    }
这里有一个游乐场

这个应该可以:

import std.stdio;
import std.traits;

abstract class Event {

}

class NewEvent : Event {
}

class NewEvent2 : Event {
}

class EventTarget {
    void addEventListener(T : Event)(void delegate(T) listener) {
        this.listeners ~= DG(listener);
    }

    void dispatchEvent(T : Event)(T event) {

        foreach (listener; listeners)
        {            
            if (listener.type_name == fullyQualifiedName!T)
            {
                listener(event);
            }
        }
    }

private:    
    DG[] listeners;
}

struct DG
{
    string type_name;
    void delegate(Event) dg;
    alias dg this;
    this(T : Event)(void delegate(T) listener)
    {
        type_name = fullyQualifiedName!T;
        dg = cast(void delegate(Event)) listener;
    }
}

void main() {
    auto target = new EventTarget();

    target.addEventListener((NewEvent event) {
        writeln("executed handler for NewEvent", event);
    });

    target.addEventListener((NewEvent2 event) {
        writeln("executed handler for Event", event);
    });

    target.dispatchEvent(new NewEvent());
    target.dispatchEvent(new NewEvent2());
}

看起来像是“我会使用关联数组”的副本:或者如果你真的想使用数组:关联数组也是一个不太复杂的版本。