Where does "U" in Rebindable.Rebindable come from?

simendsjo simendsjo at gmail.com
Fri Mar 30 06:03:49 PDT 2012


On Fri, 30 Mar 2012 01:09:06 +0200, Simen Kjærås <simen.kjaras at gmail.com>  
wrote:

> On Thu, 29 Mar 2012 22:15:41 +0200, simendsjo <simendsjo at gmail.com>  
> wrote:
>
>> If you look at the struct, it uses the type U in, among others, the  
>> union.
>>
>> The only place I could see U referenced is in the first static if, but  
>> I cannot recreate this behavior:
>> void main() {
>>      static if(is(int X == const(U), U))
>
> Ah, the magic of isExpressions...
>
> What happens here is the isExpression asks 'if X is an int, does it
> match the pattern const(U), where U is some type?'
>
> Of course, there is no U for which const(U) == int, so the isExpresion
> returns false, and your static assert triggers.
>
>
>>     static if (!is(T X == const(U), U) && !is(T X == immutable(U), U))
>
> Again, 'is there a U such that const(U) == T?', then the same for
> immutable(U). In other words - 'is T mutable?'.
>
> The reason the U is there is to explain to the compiler that we're
> talking about this specific U, not some other U that may be defined
> elsewhere in the program.
>
> The same pattern is used in std.typecons.isTuple:
>
> template isTuple(T)
> {
>      static if (is(Unqual!T Unused : Tuple!Specs, Specs...))
>      {
>          enum isTuple = true;
>      }
>      else
>      {
>          enum isTuple = false;
>      }
> }
>
> It can also be extended to other templates:
>
> struct Foo() {}
> struct Foo(int n) {}
> struct Foo(T) {}
>
> template FooType(T) {
>      static if (is(Unqual!T Unused : Foo!())) {
>          enum FooType = "Type 1";
>      } else static if (is(Unqual!T Unused : Foo!n, int n)) {
>          enum FooType = "Type 2";
>      } else static if (is(Unqual!T Unused : Foo!U, U)) {
>          enum FooType = "Type 3";
>      } else {
>          enum FooType = "No Foo!";
>      }
> }
>
>
> Hope this helps.

Look at the Rebindable example again. What I don't understand is how U can  
be defined in the else block.
Like your example here. "Unused" isn't defined in the else block, right..?


More information about the Digitalmars-d-learn mailing list