Я изучаю 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());
}
Здесь есть игровая площадка https://run.dlang.io/is/XdTVBc