On Thursday, 8 September 2022 at 03:18:08 UTC, Ali Çehreli wrote:
I looked at how std.variant.VariantN prints the correct type
and failed to understand the magic there. :(
Then I came up with storing a lambda that is created when the
exact type is known. The following simple variant can carry
arbitrary set of data because the data is provided as sequence
template parameters (aka variadic).
This is actually pretty much exactly what VariantN does, except
instead of storing a pointer to a lambda, it stores a pointer to
an instance of a template function.
The member variable `fptr` [1] is the equivalent of your
`dataToStr`. It stores a pointer to an instance of the `handler`
template [2]. Whenever a new value is assigned to the VariantN,
`fptr` is updated to point to the template instance corresponding
to the new value's type [3].
[1]
https://github.com/dlang/phobos/blob/v2.100.1/std/variant.d#L217-L218
[2]
https://github.com/dlang/phobos/blob/v2.100.1/std/variant.d#L260-L645
[3]
https://github.com/dlang/phobos/blob/v2.100.1/std/variant.d#L731