On Saturday, 16 April 2016 at 00:03:59 UTC, Jonathan M Davis
wrote:
On Friday, April 15, 2016 20:52:42 WebFreak001 via
Digitalmars-d-learn wrote:
void assertf(string file = __FILE__, size_t line = __LINE__,
Args...)(lazy bool condition, in string message, Args args) {
Yes, you can do that, but do _not_ do that unless you really
have no other choice. What you need to realize is that because
the file and line number arguments will be unique for every
call to this function, it will generate a new instantiation of
it _every_ time it is called. So, you're going to get a lot of
code bloat. There are rare cases where such bloat would be
acceptable, but in the general case, it's a terrible thing to
do. This particular case might be acceptable given how short it
is, but in general, using __FILE__ or __LINE__ as template
arguments should be avoided like the plague.
A few tricks to reduce this bloat:
- Write a small wrapper. This will still give bloat, but only of
small functions:
void assertf(string file = __FILE__, size_t line = __LINE__,
Args...)(lazy bool condition, in string message, Args args) {
assertfImpl(file, line, condition, message, args);
}
- Only care about line numbers in debug mode. Makes debug more
bloated, code less readable, and you lose out on line numbers in
release. Still worth it occasionally:
version (debug) {
void foo(string file = __FILE__, size_t line = __LINE__,
Args...)(Args args) {
// Stuffs.
}
} else {
void assertf(Args...)(Args args) {
// Stuffs.
}
}
I'd love to have a way to pass the file and line number info as
regular parameters, though. Something like:
void foo(Args...)(Args args, string file = __FILE__, int line =
__LINE__) {}
Sadly, currently not possible. Maybe we could overload @disable
for this purpose?
void foo(Args...)(Args args, @disable string file = __FILE__,
@disable int line = __LINE__) {}
--
Simen