Trouble creating a formatted assert wrapper
Peter Alexander
peter.alexander.au at gmail.com
Sun Sep 2 16:40:28 PDT 2012
On Sunday, 2 September 2012 at 20:30:26 UTC, Timon Gehr wrote:
> On 09/02/2012 07:14 PM, Peter Alexander wrote:
>> One thing that's always bothered me is that I have to use
>> std.string.format to produce useful assert messages:
>>
>> assert(x == 1, format("x doesn't equal 1, it is %d", x));
>>
>>
>> Of course, I tried to solve this by producing my own
>> assert-like
>> function wrapper:
>>
>> void myAssert(Args...)(lazy bool condition, lazy Args args)
>> {
>> assert(condition, format(args));
>> }
>>
>>
>> That's all good, but the problem now is that I get the wrong
>> file and
>> line in the assert message, so I tried to use the default arg
>> __FILE__
>> and __LINE__ trick:
>>
>> void myAssert(Args...)(lazy bool condition, lazy Args args,
>> int line =
>> __LINE__, string file = __FILE__)
>> {
>> if (!condition)
>> {
>> writeln("Assertion failed @ %s:%d", file, line);
>> writefln(args);
>> exit(1);
>> }
>> }
>>
>>
>> But I can't have default arguments because of the variadic
>> arguments!
>>
>> Can anyone think of a way around this?
>
> I don't think there is a deep reason why IFTI shouldn't succeed
> in this case.
Consider:
myAssert(false, "%d", 1);
What is Args? "%d", 1 could refer to the optional arguments, or
the variadic arguments. Both match.
More information about the Digitalmars-d
mailing list