`AnyHashableValue` is similar to `AnyHashable`. `AnyHashableValue` holds the underlying event ID and can be obtained by the users. `AnyHashable` doesn't hold the underlying event ID for better performance.
Any values of hashable types can be converted to `AnyHashable` implicitly, thus the values can be passed to `EventDispatcher` or `EventQueue` as the event type.
Even though `AnyHashable` and `AnyHashableValue` look smart and very flexible, I highly don't encourage you to use them at all because that means the architecture has flaws. You should always prefer to single event type, such as `int`, or `std::string`, than mixing them.
If you want to use `AnyHashable` or `AnyHashableValue`, don't forget to take into account of the collision created by `std::hash`, and be sure your event IDs don't collide with each other.
If you find there are good reasons to mix the event types and there are good cases to use `AnyHashable` and `AnyHashableValue`, you can let me know.