Recommended way to do RAII cleanly

Jonathan M Davis jmdavisprog at gmail.com
Mon Jul 12 15:19:08 PDT 2010


On Monday, July 12, 2010 12:18:38 Simen kjaeraas wrote:
> Jonathan M Davis <jmdavisprog at gmail.com> wrote:
> > Except that that's two statements and it's no longer RAII. The beauty of
> > doing
> > it entirely in the constructor and destructor is that you only need one
> > statement and the whole thing takes care of itself. With scope, you have
> > to
> > worry about remembering to use scope, and even if you do, that's two
> > statements
> > instead of one. Obviously, it works, but it's not as clean or elegant.
> 
> So use an enum and string mixins:
> 
> import std.stdio;
> 
> enum bar = q{
>      writeln( "The bar has opened." );
>      scope( exit ) {
>          writeln( "The bar has closed." );
>      }
> };
> 
> void main( ) {
>      writeln( "Entering..." );
>      mixin( bar );
>      writeln( "Exiting..." );
> }
> 
> Output:
> Entering...
> The bar has opened.
> Exiting...
> The bar has closed.

That's a pretty good solution, though it does feel like you're fighting the 
language when you have to completely change your construct simply because the 
normal one isn't able to have a version without any arguments to it. I guess 
that if that's what I have to do, that's what I'll do, but it definitely feels 
ugly to me in comparison - particularly when I can still use RAII in cases where 
the constructor does take arguments.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list