    #include <utility>
    #include <type_traits>
    #include <cstddef>
    
    template< typename FuncSig, FuncSig func >
    struct Functor {
      template<typename... Args>
      auto operator()(Args&&... args) const
      -> decltype( func(std::forward<Args>(args)...) )
        { return ( func(std::forward<Args>(args)...) ); }
    };
    
    struct Zeroer {
      template<typename T>
      void operator()( T& t ) const {
        t = 0;
      }
    };
    template< typename T, typename Creator, typename Destroyer, typename Nuller=Zeroer >
    struct RAII_handle {
      RAII_handle( std::nullptr_t ):
        data()
      {
        Nuller()(data);
      }
      RAII_handle( RAII_handle const& ) = delete;
      RAII_handle( RAII_handle && o ):data(std::move(o.data)) {
        Nuller()(o.data);
      }
      RAII_handle& operator=( RAII_handle const& ) = delete;
      RAII_handle& operator=( RAII_handle && o ) {
        data = std::move(o.data);
        Nuller()(o.data);
        return *this;
      }
      template<typename... Args>
      RAII_handle( Args&&... args ):
        data( Creator()(std::forward<Args>(args)...) )
      {}
      auto close()->decltype( Destroyer()(std::declval<T&>()) ) {
        auto retval = Destroyer()(data);
        Nuller()(data);
        return retval;
      }
      ~RAII_handle() {
        close();
      }
      T& get() { return data; }
      T const& get() const { return data; }
 
      T& operator*() { return get(); }
      T const& operator*() const { return get(); }
 
      T* operator->() { return &get(); }
      T const* operator->() const { return &get(); }
    private:
      T data;
    };
    
    #include <iostream>
    typedef unsigned char HANDLE;
    HANDLE CreateFile( char const* name ) {
      std::cout << name << "\n";
      return 7;
    }
    bool CloseFile( HANDLE h ) {
      if (h) {
        --h;
        std::cout << (int)h << "\n";
        return true;
      } else {
        std::cout << "already closed\n";
        return false;
      }
    }
       
    typedef RAII_handle< HANDLE, Functor< HANDLE(*)( char const* ), CreateFile >, Functor< bool(*)(HANDLE), CloseFile > > FileHandle;
 
    int main() {
      FileHandle bob("hello.txt");
      unsigned char value = *bob;
      bob.close();
    }