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

anonymous anonymous at example.com
Tue Mar 18 10:38:25 PDT 2014


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 */)
---

The snippet as given then compiles, but left and right won't be
known in the template body. To achieve that, if you can do
without the template constraint, just make it a static if in the
body:
---
template Left(P)
{
      static if (is(P == Pair!(left, right), alias left, alias
right)
          && is(typeof(left) == int)
          && is(typeof(right) == int))
      {
          alias Left = left; /* or whatever */
      }
      else static assert(false);
}
---

Otherwise, if you can't do without the template constraint, you
have to duplicate the logic.


More information about the Digitalmars-d-learn mailing list