>>288

template< typename T, typename R > struct killer_base
 : public std::unary_function< T, R > {
 virtual ~killer_base() {};
 virtual R operator()( T ) = 0;
};
template< typename F, typename T, typename R > struct killer
 : public killer_base<T,R> {
 F f;
 killer( F func ) : f(func) {}
 R operator()( T t ) { return f(t); }
};
template <typename T, typename R = void>
class AutoResource {
T resource;
auto_ptr< killer_base<T,R> > const killFunc; // noncopyable
public:
template< typename KillerFunc >
AutoResource(T res, KillerFunc func )
 : resource(res), killFunc(new killer<KillerFunc,T,R>(func)) {}
~AutoResource() { (*killFunc)(resource); }
};