template <class O> struct OperationPattern { typedef decltype(((O)nullptr)->GetDeferral()) D; OperationPattern(O operation) : operation(operation), deferral(operation->GetDeferral()) { } O Operation() const { return operation; }; D Deferral() const { return deferral; }; void Dispose() { deferral->Complete(); } operator Disposable() const { // make sure to capture state and not 'this'. // usage means that 'this' will usualy be destructed // immediately auto local = deferral; return Disposable([local]{ local->Complete(); }); } private: O operation; D deferral; }; template <class O> OperationPattern<O> make_operation_pattern(O o) { return OperationPattern<O>(std::move(o)); }