$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Martin Schürch (mschuerch_at_[hidden])
Date: 2000-11-14 11:22:01
Hi
I have looked at the implementation off auto_restore<>.
I don't  know what was disussed about this before. But perhaps this was
not mentioned yet:
After reading the article "Generic<Programming>: Change the Way You
Write Exception -Safe Code Forever" of Andrei Alexandrescu, I
implemented auto_restore with the trick, where a reference to a
temporary instance is stored.
This would have the big advantage, that no type must be explicitely
delivered to create an auto_restorer .
Thanks for any feedback.
Martin
namespace boost{
   namespace helper {
      class auto_restore_base {
      public:
         ~auto_restore_base () {}
      private:
         auto_restore_base& operator=(const auto_restore_base&);
      };
      template <class T>
      class auto_restore_t : public auto_restore_base {
      public:
         auto_restore_t(T& variable)
            : variable_(variable), value_(variable) {}
         auto_restore_t(T& variable, const T& value)
            : variable_(variable), value_(value) {}
         ~auto_restore_t() { variable_ = value_;} //nicht virtual
      private:
         T& variable_;
         T  value_;
      };
   } // helper
   typedef const helper::auto_restore_base& auto_restorer;
   template<class T>
   helper::auto_restore_t<T> make_restorer(T& variable, const T& val)
   {
      return helper::auto_restore_t<T>(variable, val);
   }
   template<class T>
   helper::auto_restore_t<T> make_restorer(T& variable)
   {
      return helper::auto_restore_t<T>(variable, variable);
   }
} // boost
#include <cassert>
#include <iostream>
using namespace std;
int main()
{
   {
      int value = 0;
      {
         boost::auto_restorer restorer = boost::make_restorer(value,
10);
         assert(value==0);
         value = 19;
         assert(value==19);
      }
      assert(value == 10);
   }
   {
      int value = 27;
      {
         boost::auto_restorer restorer = boost::make_restorer(value);
         assert(value==27);
         value = 19;
         assert(value==19);
      }
      assert(value == 27);
   }
   return 0;
}