Getting a template parameter list

Philippe Sigaud philippe.sigaud at gmail.com
Mon Jul 23 06:46:37 PDT 2012


On Monday, 23 July 2012 at 13:32:54 UTC, Philippe Sigaud wrote:
> As an aside to a reflection-related train of thought, I tired 
> again to get a templated type's parameter list.
>
> I mean, given
>
> class C(T) { T t; }

Drat, 'tab' is dangerous with the forum interface, sorry for that.

So given C above and

auto c = new C!(int)();

I want a template that, given typeof(c), gives me back 'C' and 
'int'.
is() is our friend here, notably the new T... extension:

import std.typetuple;
template Composition(T) if (isComposite!T)
{
     static if (is(T comp == Name!(U), alias Name, U) || is (T 
comp == Name!(U), alias Name, U...))
         alias TypeTuple!(Name, U) Composition;
}

(isComposite!T is the same check with is())

Works beautifully:

auto t = tuple(1,"abc", 'c');

writeln(Composition!(typeof(t)).stringof); // ("Tuple(Specs...)", 
int, string, char)

So, I get "Tuple(Specs...)" (the template name) and the 
arguments. Nice!

Except, this does not work for 2-args templates. I thought the 
U... branch would get them, but apparently, U... means 'with a 
template param tuple' very strictly. No problem, I'll just add 
the 2, 3 and 4-args cases, that should be enough.

template Composition(T) if (isComposite!T)
{
     static if (is(T comp == Name!(U), alias Name, U) || is (T 
comp == Name!(U), alias Name, U...))
         alias TypeTuple!(Name, U) Composition;
     else static if (is(T comp == Name!(U,V), alias Name, U, V))
         alias TypeTuple!(Name, U,V) Composition;
     else static if (is(T comp == Name!(U,V,W), alias Name, U, V, 
W))
         alias TypeTuple!(Name, U,V,W) Composition;
...
}

(and isComposite accordingly).

Right. Except, this only gets template instantiations with pure 
types as parameters. Things like std.algorithm.map which take a 
function by name are out.

OK... So, I'll add also alias overloads. Hmm, Pure Type / Alias : 
2 possibilities, so for 3 args that's 8 different tests to do + 4 
for 2-params, + 2 for the single param and the tuple...
Except, you can have a tuple also in 2-params and 3-params 
templates.

Also, what about value template parameters? I tested, this does 
not work when passed strings or ints, or whatever. I should test 
for them also.

Argh, so it's more 10 different possibilities per slot, the n-th 
power for n args.

No way am I generating a template with more than a thousand(!) 
is() tests in it!

Can someone offer me some advice on this? My old version that 
cheated with the type .stringof suddenly seems so much better.

Philippe



More information about the Digitalmars-d mailing list