You can use dynamic_cast instead of reinterpret_cast. If the pointer isn't correct it would return null. A better solution is to subclass the widget, store a function pointer for the callback which takes the same class instead of an Fl_Widget, and call that in the callback:
https://github.com/MoAlyousef/FLMH
This uses a std::function for the captures but you can use a function pointer as well.
https://github.com/gammasoft71/Examples_FLTK/blob/c6f630eaa3...