On 12/01/12 20:26, Jonathan M Davis wrote: > On Saturday, December 01, 2012 18:43:22 Timon Gehr wrote: >> On 12/01/2012 06:23 PM, Jonathan M Davis wrote: >>> On Saturday, December 01, 2012 12:05:49 Artur Skawina wrote: >>>>> So, unless there's a way to do it without a cast, you're stuck. And I >>>>> have >>>>> no idea how you could possibly do it without a cast. >>>>> >>>> *cast(void**)&O // assuming O is a class >>> >>> Are you sure? I'd be _very_ wary of that, because references aren't the >>> same as pointers. I don't believe that there's any guarantee whatsoever >>> that that will work, even if it happens to work now (which it may or may >>> not). >>> >>> - Jonathan M Davis >> >> Certainly works now. Another workaround that would keep working if class >> references were not pointers is: >> >> ((Object o)=>cast(void*)o)(O) // assuming O is the class object > > Ah, good point. Using Object would work just fine and doesn't rely on the > implementation details of references.
References not appearing as if they were pointers is less likely than Object growing an opCast... Another workaround (for both non-empty classes and structs) would be cast(void*)&O.tupleof[0]-O.tupleof[0].offsetof which will let you not worry about that kind of potential changes to the core of the language. :) Seriously though, if one only needs to compare the addresses of class objects, "is" may be a better solution. artur