Aliasing arguments in the template parameter list of an is-expression

Meta jared771 at gmail.com
Tue Mar 18 11:58:03 PDT 2014


On Tuesday, 18 March 2014 at 17:38:26 UTC, anonymous wrote:
> On Tuesday, 18 March 2014 at 16:02:26 UTC, Meta wrote:
>> I'd like to have the arguments of the template parameter list 
>> of an is-expression to be visible outside that is-expression, 
>> but I can't figure out a way to get an alias to them. Is 
>> something like this possible?
>>
>> struct Pair(alias left, alias right) {}
>>
>> template Left(P)
>> if (is(P == Pair!(left, right), left, right)
>>    && is(typeof(left) == int)
>>    && is(typeof(right) == int))
>> {
>>    //...
>> }
>>
>> I know that I could put a constraint on the actual Pair type 
>> that left and right must be ints, but say I was unable to do 
>> that for some reason or another... Can I access that template 
>> parameter list outside of the first is-expression somehow?
>
> Since left and right are alias parameters, you need "alias" in
> the is expression, too:
> ---
> if (is(P == Pair!(left, right), alias left, alias right)
>      && /* etc */)
> ---

Yes, my mistake. I also got an error about Pair!(1, 2) being 
unable to be interpreted at compile time, so I changed left and 
right to be types. The corrected example code:

struct Pair(left, right) {}

template Left(P)
if (is(P == Pair!(left, right), left, right)
     && is(left == int)
     && is(right == int))
{
     //Error: undefined identifier left
     alias Left = left;
}

void main()
{
	alias test = Left!(Pair!(int, int));
}

Surprisingly, left and right are actually visible in the 
subsequent is-expressions that test if they're int. However, they 
are not available in the body. Is there a way around this?


More information about the Digitalmars-d-learn mailing list