Static cast template

Rene Zwanenburg renezwanenburg at gmail.com
Mon Feb 20 12:55:12 PST 2012


Thanks. Using an abstract base class isn't a problem at the 
moment, the message types only implement the interface.

However, in case there's a situation in the future where we would 
have to use an interface I'll leave the question open.

On Monday, 20 February 2012 at 16:21:37 UTC, Daniel Murphy wrote:
> Does message _have_ to be an interface?  With an abstract class 
> the offset
> will always be zero, so
>
> T my_cast(T : Message)(Message m)
> {
>     debug
>         return cast(T)m;
>     else
>         return cast(T)cast(void*)m;
> }
>
> "Rene Zwanenburg" <renezwanenburg at gmail.com> wrote in message
> news:vmsydblfjawogbxsguab at forum.dlang.org...
>>A part of the project I'm currently working on relies heavily 
>>on messages being sent between objects. There's some sort of 
>>container object which receives the messages, and notifies any 
>>listeners registered to it. We can't send the messages to the 
>>final recipients directly because the sender doesn't know about 
>>the receivers existence and vice versa.
>>
>> There are many types of messages, but they all implement a 
>> Message interface. The messageListeners cast the Message to 
>> some ConcreteMessage, but the casting is starting to take a 
>> significant percentage of execution time. Due to the way 
>> MessageListeners are registered, we can be sure a 
>> MessageListener only receives the type of messages it's 
>> interested in, so the cast will never fail.
>>
>> I'm looking for a static_cast construct, which will be checked 
>> during debug, but in release mode it should minimize overhead 
>> by simply adding the interface offset to the pointer. I've 
>> tried to make use off Type.classinfo's interfaces member, but 
>> for some reason a Type's classinfo isn't available at compile 
>> time.
>>
>> So my question comes down to: does anyone know of a way to get 
>> static_cast behavior for upcasts?




More information about the Digitalmars-d mailing list