Jarrett Billingsley wrote:
On Sun, May 3, 2009 at 4:14 PM, Denis Koroskin <2kor...@gmail.com> wrote:
PHP allows function definition like this:
void foo(Args args, string fileName = __FILE__, int line = __LINE__)
{
// do stuff
}
Hidden feature: D2 allows it too, at least with templates.
void Throw(T : Throwable, string file = __FILE__, int line = __LINE__)(T ex)
{
ex.file = file;
ex.line = line;
throw ex;
}
void foobar()
{
Throw(new Exception("o hai"));
}
void main()
{
try
foobar();
catch(RangeError e)
writefln("(%s: %d) %s", e.file, e.line, e.msg);
}
I did find a sort of bug when trying a slightly different
implementation of this though - any kind of explicit instantiation of
the Throw template causes the __FILE__ and __LINE__ to be evaluated in
the scope of the template rather than at the call site.
That's intentional and is used in enforce() and a couple other places in
Phobos.
Andrei