Anyone know what's going on here? (variable with an instantiated template as a type shows up as void when instantiating another template)

Gareth Charnock gareth.tpc at gmail.com
Sat Apr 24 12:01:00 PDT 2010


Just got a chance to test the isInstanceOf template and it does (after 
some fiddling) provide a workaround for this bug. Thanks.

Philippe Sigaud wrote:
> On Fri, Apr 23, 2010 at 14:57, Robert Jacques <sandford at jhu.edu 
> <mailto:sandford at jhu.edu>> wrote:
> 
>     PS. You can get things like this to work using template constraints.
> 
>     For example, here's a horrible hack:
>     void unary_op(T)(T value)
>     if(T.stringof[0..3] == "A!(" && T.stringof[$-1..$] == ")"  ){}
> 
> 
> Maybe a bit less hacky (?) using an is expression:
> 
> void unary_op(T)(T value) if (is(T TT == A!N, uint N)) {}
> 
> 
> N does not exist inside the function, though. For that, you'd have to 
> recreate it with a static if:
> 
> void unary_op(T)(T value) if (is(T TT == A!N, uint N))
> {
>     static if (is(T TT == A!N, uint N)) // read this as "if T is a type 
> like A!N, for some uint N"
>         writeln(N);
> }
> 
> 
> I have a template that may be useful there:
> 
> /**
> isInstanceOf!(Type, templateName) is true iff Type is an instantiation 
> (is that the right term?) of templateName.
> */
> template isInstanceOf(T, alias templ)
> {
>     static if (T.stringof.length >= __traits(identifier, templ).length 
> && T.stringof[0..__traits(identifier, templ).length] == 
> __traits(identifier, templ))
>         enum bool isInstanceOf = true;
>     else
>         enum bool isInstanceOf = false;
> }
> 
> Example:
> 
> void unary_op2(T)(T value) if (isInstanceOf!(T, A))
> {
> // T is an A!(someParam)
> }
> 
> If you want to extract the 'someParam' part, it's doable by using a CT 
> function that extracts what's between the first '(' and the 
> corresponding ')'. I think I have somewhere a template that alias itself 
> to the corresponding typetuple:
> 
> TemplateParametersTypeTuple!(Temp!(int, double, char[]))  =>  
> TypeTuple!(int,double, char[])
> 
> Is anyone interested by this one?
> 
> Philippe
> 
> 
> 
> 



More information about the Digitalmars-d mailing list