
First version of BoostCandidate.Finally is available. There is only one header file so I didn't put the library to boost vault. I can do this upon request. Header file boost/finally.hpp: http://tinyurl.com/fwy6q Examples: libs/finally/example/hello.cpp: http://tinyurl.com/errx4 libs/finally/example/finally.cpp: http://tinyurl.com/jc692 Documentation in qbk format: http://tinyurl.com/h655f Alternatively, you can browse CVS tree online: http://cvs.sourceforge.net/viewcvs.py/cpp-experiment/finally/ In short, BoostCandidate.Finally is a (better, in my opinion) replacement both for try-finally block and for ScopeGuard. It can be used when RAII approach is not quite applicable. Typical example is VectorInserter class in ScopeGuard article by Andrei Alexandrescu and Petru Marginean ( http://tinyurl.com/26vzp ). Below is a comparison with ScopeGuard approach (typeof registration is omitted for brevity). // code snipset copied from ScopeGuard article: void User::AddFriend(User& newFriend) { friends_.push_back(&newFriend); ScopeGuard guard = MakeObjGuard( friends_, &UserCont::pop_back); pDB_->AddFriend(GetName(), newFriend.GetName()); guard.Dismiss(); } // First form of BoostCandidate.Finally void User::AddFriend(User& newFriend) { friends_.push_back(&newFriend); bool dismiss = false; BOOST_FINALLY_BEGIN( (friends_)(dismiss) ) { if(!dismiss) friends_.pop_back(); } BOOST_FINALLY_END; pDB_->AddFriend(GetName(), newFriend.GetName()); dismiss = true; } // Second form of BoostCandidate.Finally void User::AddFriend(User& newFriend) { friends_.push_back(&newFriend); boost::scope_guard guard; BOOST_FINALLY_BEGIN( (guard)(friends_) ) { friends_.pop_back(); } BOOST_FINALLY_END(guard); pDB_->AddFriend(GetName(), newFriend.GetName()); guard.dismiss(); } Waiting for comments and suggestions ... -- Alexander Nasonov alnsn <@> yandex <.> ru