$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Andrei Alexandrescu (andrewalex_at_[hidden])
Date: 2002-06-25 16:22:24
<scleary_at_[hidden]> wrote in message
news:22602E7E3B92D411969B0090273CC28B1D21EC_at_cecexchange.jerviswebb.com...
> I've messed around in the past with different versions of classes that
would
> run arbitrary code when destroyed. Here's some different functionality
that
> I've found useful:
>
> . Allow *any* action to be run; Boost.Functional can already support
this;
> why have ScopeGuard duplicate this functionality?
I'd be interested in that, too.
> . Have a type of ScopeGuard that wraps its action in try...catch,
similar
> to the article, but have another type that does not.
I think the best approach is to have ScopeGuard not use try/catch in its
destructor, and create a simple wrapper template eat_exceptions that can be
composed with the user-passed function.
> . Have a type of ScopeGuard that only runs its action if the destructor
> was called as part of stack unwinding, not normal block scope exit (useful
> for "rollback" operations).
This might become tricky if a ScopeGuard is created during stack unwinding.
> . Have a type of ScopeGuard that follows strict scoping rules, but have
> another type whose scope can be "transferred" to a calling function.
This is what ScopeGuardImpl's copy constructor does.
> When you start looking at the different useful types of ScopeGuard
classes,
> two things become apparent:
> 1) It would be best as a policy-designed class
It's not apparent to me. Part of ScopeGuard's beauty stems from its simple
semantics, economy of means, and small interface.
> 2) It's very close to a SmartPtr. So close, in fact, that I make the
> claim that a ScopeGuard *is* a SmartPtr.
For one thing, ScopeGuard uses the "const reference initializer" idiom which
leads to efficient code but which is not used with smart pointers.
Andrei