I've gotten extremely close. The DPaste link that follows
demonstrates three different templates:
The first template is capable of generating the string for and
mixing in the definition of a class that has a single arbitrary
argument. An object of that class is instantiated, and its
printSelf() method is invoked to demonstrate that the arbitrary
data member it was generated with is indeed what you would expect
it to be. The magic here is fairly plain.
The second template is capable of generating the string for the
definition of a class that has some arbitrary number of arbitrary
arguments at -compile- time, through the use of variadic template
parameters. The issue with this string is that the type at T[n],
where T is the variadic template parameter, is mangled at
compile-time. The data-member-generating foreach loop shows the
three potential ways I attempted to get at the full type
information. All three have some problem with it, with typeid
giving a fully mangled type, fullyQualifiedName giving a mostly
mangled type, and __traits(identifier) giving just whatever the
alias was that was passed in. The two other commented-out code
sections in this template was an attempt to resolve the type
information at the time of mixin, rather than within the string
generation function, but this doesn't work.
The third template demonstrates that D actually can resolve the
individual types of the variadic template parameter correctly, so
long as it's allowed to do this at runtime. The string printed as
a result of instantiating this template shows exactly the class
definition we want to be able to mix in at compile time, but this
type information eludes us at compile time even though it's
clearly readily available at runtime.
The code referenced above is here: http://dpaste.dzfl.pl/a6feafc8
I'm not sure why DPaste is failing to compile the code, but I am
compiling it with DMD v2.063.2. Also included at the bottom of
the DPaste listing is the output I get when running that program,
exactly as listed.
With all of that said, there is a fundamental difference between
how the first template and the second two templates are written.
The first one, which works, resolves the T parameter during the
mixin. The second two try to resolve the variadic types during
class definition string generation. I am pretty convinced at this
point that if this is ever going to work, the variadic template
parameter type tuple needs to be resolved during the mixin, like
with the first example. The how is the question. Again, I
attempted to have the variadic template parameter types deduced
during execution of the mixin with the two blocks of
commented-out code in the second template, but I had no luck
there, as I got the same errors as I did in my previous big post.
So.
By the first template, we know that we can generate class
definitions with arbitrary data members and mix them in at
compile time using aliases for templated,
compile-time-mixin-generated classes, but for each new arbitrary
type we want the generated class to have, we need to have a
distinct template parameter for the type.
By the third template, we know that we should have access to the
fully qualified types in the variadic template parameter, but it
at least appears to only be fully resolved at runtime (which I
feel like is me misunderstanding something, but then that's also
the root of our problem).
By the second template, we show that trying to deduce the types
within the type tuple (the variadic template parameter) during
class definition string generation does not work, which leads us
to believe it must be resolved while mixing in the class
definition using the templated types, but that also doesn't seem
to work (as noted by the failed attempts in the two commented out
blocks of the second template).
I feel like we're so very close to the answer, whether it's "Oh,
you just have to do this" or "You're crazy, this is impossible."
If only it was possible to summon Andrei. He'd know! Maybe it's
some sort of a Bloody Mary thing?
Andrei, Andrei, An-