Hello,
I am trying to derive a struct from another. I want to modify each field such that type of it goes from some T to Nullable!T, preserving all fieldnames and UDAs.
I think that fieldnames and UDAs can only be duplicated via string-mixins. This means that all field-types that aren't visible in the template scope have to first be aliased to some name that can be referenced in the string mixin. I got this to work for simple types, but as soon as the field types are some templated type, doing this naively stops to work.
Same story for UDAs. As soon as multiple unknown types are involved, I can't simply take an alias anymore.
The one workaround I found is to make my introspective struct part of a template mixin, this way it can access all symbols of the callsite and can use all the symbols. Is this the recommended way to do it? Generating a string mixin directly would probably work just as well, but that seems even more ugly and will probably be more susceptible to collisions.
This not so simple gist demonstrates what I tried so far. injectedNameFields generates a string that when mixed in, will create all the field names with the desired types. I suggest first looking at main and compiling+running to get an idea what is supposed to happen.
https://gitlab.com/-/snippets/3687470
After describing my problem, here is a non-exhaustive list of questions I have:
- Is UDA propagation possible without string mixins?
- To make it run without template mixin, I will need to write a recursive template (recursive over template args as well as UDA instantiated structs) that accounts for cases: normal type, templated type, enum (C style), enum value compile time constant, etc. ... Is this correct, or is there a way to just grab any compile time alias/enum without giving each "type" special treatment?
- Are template mixins vulnerable to name collisions?