Assigning Interface to Object

Simen kjaeraas simen.kjaras at gmail.com
Mon Jan 17 09:00:43 PST 2011


Steven Schveighoffer <schveiguy at yahoo.com> wrote:

> Nope.  try it:
>
> interface I { bool opEquals(I other); }
>
> I a;
> I b;
>
> a == b; // same error.
>
> The problem is that when TDPL was implemented, (Object)a == (Object)b  
> was redefined from a.opEquals(b) to object.opEquals(a, b), where object  
> is the module object.
>
> That function's signature looks like this:
>
> bool opEquals(Object lhs, Object rhs);
>
> For some reason the compiler tries to do the same thing with interfaces,  
> but of course, there is no opEquals for your specific interface in  
> object.  Even if there was, you'd likely get an overload error.
>
> This would be easily resolved if interfaces were known to be Objects.

There's another way that should work, replacing the global opEquals in
object.di with this:


equals_t opEquals(T, U)(T lhs, U rhs)
     if ((is(T == class) || is(T == interface)) && (is(U == class) || is(U  
== interface)))
{
     if (lhs is rhs)
         return true;
     if (lhs is null || rhs is null)
         return false;
     static if (__traits(compiles,{lhs.opEquals(rhs);}))
     {
         if (typeid(lhs) == typeid(rhs))
             return lhs.opEquals(rhs);
         static if (__traits(compiles,{lhs.opEquals(rhs) &&  
rhs.opEquals(lhs);}))
         {
             return lhs.opEquals(rhs) &&
                 rhs.opEquals(lhs);
         }
         else static assert( false, T.stringof ~ " cannot be compared to a  
" ~ U.stringof );
     }
     else static assert( false, T.stringof ~ " cannot be compared to a " ~  
U.stringof );
}


There are some problems, however. This generates bloat, as instantiations
are created for each combination of types compared. Also, it is only tested
for a few simple cases.

-- 
Simen


More information about the Digitalmars-d-learn mailing list