Sometimes you want to assert at compile time. E.g., you might want to assert that type
double is IEEE-754, using
std::numeric_limits, except that that’s pretty dangerous since the g++ compiler reports that it’s IEEE-754 even when it’s been instructed to emit fast, non-IEEE-754-conforming code. But e.g. in the cppx library code there are compile time asserts, static asserts, like
CPPX_STATIC_ASSERT( CPPX_IS( DerivedAndBase, Derived, Base ) ).
The cppx library’s static assert, a macro
CPPX_STATIC_ASSERT, is utterly simple:
#define CPPX_STATIC_ASSERT( e ) \ typedef char CppxStaticAssertShouldBeTrue[(e)? 1 : -1] // The following macro is mainly comment-like, but performs such checking as it can. #define CPPX_IS_OVERRIDE_OF( memberSpec, args ) \ ::progrock::cppx::devsupport::suppressUnusedWarning( sizeof( (memberSpec args, 0) ) )
A static assert failure cannot be ignored. So when a static assert fails you have to look at that place in the code. And that tells you what the assert was about.
CPPX_IS_OVERRIDE_OF macro is a special kind of static assert that does not guarantee to fail, but that generally catches a failure to actually override a method. I’ve found that it helps to have
CPPX_IS_OVERRIDE_OF macro calls as in-source documentation. And the checking that it does can’t hurt.
Using this macro does however require that the overridden base class method is accessible, which generally means using
protected instead of
private for virtual methods (it’s just a matter of trusting derived classes).