Trouble creating a formatted assert wrapper

timotheecour thelastmammoth at gmail.com
Sun Sep 2 12:31:52 PDT 2012


>>> void myAssert(int line = __LINE__, string file = __FILE__, 
>>> Args...)(lazy bool condition, lazy Args args) {

Won't that create "template code bloat" ? Ie everytime myAssert 
is used a new function is created.

There was if I remember some discussion regarding not passing 
__LINE__,__FILE__ in assert related functions because of that.

If backtrace worked properly we should be able to go up the stack 
and get line number information when the assert fails (no time 
penalty when assert doesn't fail).

Another option is to use a lazy tuple argument inside myAssert 
instead of variadic arguments, which allows to pass line and file 
AFTER, without template bloat.

A related question:
In C++ we can stringify arguments and use it to provide 
informative asserts without duplicating code specifying a string 
version of the condition:
#define assert( isOK ) ( (isOK) ? (void)0 : 
(void)myAssert(#isOK,__LINE__,__PRETTY_FUNCTION__, __FILE__) )

Likewise for related quick debug functions:
#define DEBUG(val) myDEBUG(#val,val)

There seems to be no way of doing this currently (besides the 
ugly mixin(myAssertString("i==0")) which would parse the 
condition at CT).

Would that be possible to add?





More information about the Digitalmars-d mailing list