c++ - Cast DWORD_PTR to class and vice versa without c-style cast -


according herb sutter's c++ coding standards: 101 rules, guidelines, , best practices programmer should avoid c-style casting:

c-style casts have different (and dangerous) semantics depending on context, disguised behind single syntax. replacing c-style casts c++-style casts helps guard against unexpected errors

i trying pass pointer p_ctrl winapi callback function, want use dword_ptr parameter of callback function (below example working, contains c-style casts commented):

wndctrls* wndctrls::button ( wndctrls* const p_ctrl, hwnd hwnd, rect const &rc ) {     p_ctrl->ctrl = createwindowex (         0,         l"button",         p_ctrl->w_classnamebutton.c_str (),         ws_visible | ws_child | bs_ownerdraw,         rc.left,         rc.top,         rc.right,         rc.bottom,         hwnd,         0,         (hinstance)getwindowlongptr ( hwnd, gwl_hinstance ), // problematic c-style cast know workaround         p_ctrl     );     setwindowsubclass ( p_ctrl->ctrl, wndctrls::ctrlproc, 0, (dword_ptr)p_ctrl ) ) // c-style cast      return p_ctrl; }  lresult callback wndctrls::ctrlproc ( hwnd hwnd, uint message, wparam wparam, lparam lparam, uint_ptr uidsubclass, dword_ptr dwrefdata ) {     wndctrls* const p_ctrl = (wndctrls*)dwrefdata; // problematic c-style cast     switch ( message )     {         ...     }     return defsubclassproc ( hwnd, message, wparam, lparam ); } 

i tried dynamic cast, gives me errors. reinterpret_cast should not used @ (according sutter).

please there way casts using c++ provided functions?

sutter's advice that: advice. aren't hard , fast rules; they're suggestions encourage write safer, more robust code.

this 1 of cases advice doesn't work.

in many places, windows api needs able pass data may or may not pointer. such, uses pointer-sized integer, using c-style cast (remember windows api c-based) turn integer pointer. is safe because documentation requires be: if give windows garbage pointer value, you're breaking function's rules!

the standard c/c++ names pointer-sized integers intptr_t (signed) , uintptr_t (unsigned). however, windows predates c99 , c++11 (when these introduced), uses own names: long_ptr (signed) , dword_ptr , ulong_ptr (unsigned). in addition, wparam, lparam, , lresult pointer-sized, since window messages need deal pointers.

so go ahead , use c-style cast or reinterpret_cast<>, whichever 1 prefer. other casts won't work because need interpret integer pointer, other casts won't let do.

you may need these anyway because there other places that, because windows api needs not in c usable other languages, subclassing replaced having object of struct derive first element of dervied struct. apparent in wm_notify message, possible notification structs nmhdr. keep in mind.


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -