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

simendsjo simendsjo at gmail.com
Thu Mar 29 13:15:41 PDT 2012


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))
     {
     }
     else
     {
         static assert(is(typeof(U))); // false, U not defined
     }
}


And std.typecons.Rebindable:

template Rebindable(T) if (is(T == class) || is(T == interface) ||  
isArray!(T))
{
     static if (!is(T X == const(U), U) && !is(T X == immutable(U), U))
     {
         alias T Rebindable;
     }
     else static if (isArray!(T))
     {
         alias const(ElementType!(T))[] Rebindable;
     }
     else
     {
         struct Rebindable
         {
             private union
             {
                 T original;
                 U stripped;
             }
             void opAssign(T another) pure nothrow
             {
                 stripped = cast(U) another;
             }
             void opAssign(Rebindable another) pure nothrow
             {
                 stripped = another.stripped;
             }
             static if (is(T == const U))
             {
                 // safely assign immutable to const
                 void opAssign(Rebindable!(immutable U) another) pure  
nothrow
                 {
                     stripped = another.stripped;
                 }
             }

             this(T initializer) pure nothrow
             {
                 opAssign(initializer);
             }

             @property ref T get() pure nothrow
             {
                 return original;
             }
             @property ref const(T) get() const pure nothrow
             {
                 return original;
             }

             alias get this;
         }
     }
}


More information about the Digitalmars-d-learn mailing list