cast class references to void and back

Regan Heath regan at netmail.co.nz
Tue Sep 18 03:42:09 PDT 2007


BLS wrote:
> BLS schrieb:
>>
>>  From the D spec;
>>
>> Pointer Conversions
>> Casting pointers to non-pointers and vice versa is allowed in D, 
>> however, do not do this for any pointers that point to data allocated 
>> by the garbage collector.
>>
>> Given :
>> Class CWin : CMsg
>> {
>>   Cwin pWnd = null;  // create a refrence
>>
>>  /* C++
>>  pWnd = 
>> reinterpret_cast<CWin*>((long)((LPCREATESTRUCT)lParam)->lpCreateParams);
>>   */
>>
>>   // D probabely
>>   pWnd = cast(CWin)(cast(LPCREATESTRUCT)lParam).lpCreateParams;
>>
>> }
>>
>> The LPCREATESTRUCT from WinUser.d
>> struct CREATESTRUCTA {
>>     LPVOID    lpCreateParams;   // Here I am
>>     HINSTANCE hInstance;
>>     HMENU     hMenu;
>>     HWND      hwndParent;
>>     // etc.
>> }
>> alias CREATESTRUCTA* LPCREATESTRUCTA;
>>
>> So :
>> 1) Do I have to put a cast(int) in there (where the (long) was in C++)
>> The reason you would use 'int' and not 'long' is that long in C++ is 
>> typically 32 bits and long in D is 64 bits.
>>
>> 2) I'm not 100% certain that it is guaranteed to work if you cast 
>> class references to void and back again.  Someone else might be able 
>> to confirm/deny this.
>> 3) Following the D spec. this is also not guaranteed to work. 
>> confirm/deny ?
>>
>> Thanks in advance
>> Bjoern
> 
> Still someone out there who is still mental health ? 'cause const 
> discussion :-)
> 
> In this case just  another question,
> In case that I define
> Class CWnd
> {
>   CWnd* pWnd = 0;
> 
> }
> Do I have then in fact CWin** (from a C++ view) ?

Sort of, you have a pointer to a reference to a Cwnd class object. 
Where a 'reference' is like but not exactly the same as a pointer.

Regan



More information about the Digitalmars-d mailing list