improve macro `down_cast`
If this macro were an inline function, it could contain the assert()
(or rather SPOT_ASSERT
) when compiling in debug mode. That would remove a lot of assertion from the code base.
It would also be easy to specialize down_cast
for shared pointer.