Calls a type-appropriate function with the value held in a SumType.
For each possible type the SumType can hold, the given handlers are
checked, in order, to see whether they accept a single argument of that type.
The first one that does is chosen as the match for that type.
Implicit conversions are not taken into account, except between
differently-qualified versions of the same type. For example, a handler that
accepts a long will not match the type int, but a handler that accepts a
const(int)[] will match the type immutable(int)[].
Every type must have a matching handler, and every handler must match at
least one type. This is enforced at compile time.
Handlers may be functions, delegates, or objects with opCall overloads. If a
function with more than one overload is given as a handler, all of the
overloads are considered as potential matches.
Calls a type-appropriate function with the value held in a SumType.
For each possible type the SumType can hold, the given handlers are checked, in order, to see whether they accept a single argument of that type. The first one that does is chosen as the match for that type.
Implicit conversions are not taken into account, except between differently-qualified versions of the same type. For example, a handler that accepts a long will not match the type int, but a handler that accepts a const(int)[] will match the type immutable(int)[].
Every type must have a matching handler, and every handler must match at least one type. This is enforced at compile time.
Handlers may be functions, delegates, or objects with opCall overloads. If a function with more than one overload is given as a handler, all of the overloads are considered as potential matches.
Templated handlers are also accepted, and will match any type for which they can be implicitly instantiated. See "Introspection-based matching" for an example of templated handler usage.