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

Reply via email to