09-Feb-2014 22:14, Jakob Ovrum пишет:
On Sunday, 9 February 2014 at 17:57:23 UTC, Dmitry Olshansky wrote:
void risef(T...)(string fmt, T args)
{
    static Failure!T slot;
    if(!slot)
        slot = new Failure!T();
    slot.assign(fmt, args);
    throw slot;
}

If the template is instantiated we can say with almost certainty that
the function will be called, so it'd be an improvement to allocate the
exception instance statically (lazily initialized with emplace), instead
of statically allocating just a reference to a GC-allocated instance.

Might be a good idea but compiler is pretty conservative with what can be created at compile-time and emplace may not play nice with CTFE.

Also, it's nice to keep the throw statement in user code, e.g. `throw
allocExf(fmt, args);`, as `throw` is a no-return statement like
`return`, `assert(false)` etc.

Good idea. Then call it 'exception(f)' and use like this:
throw exceptionf("Message with some %s substitution", "writef-like");

--
Dmitry Olshansky

Reply via email to