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