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:
In [progrock/cppx/devsupport/static_assert.h]:
#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.
The 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).
Pingback: Hubris, significant spaces, g++ | Alf on programming (mostly C++)