
This was fun to experiment with. Here's another whack at your puzzle. -Sid Sacek #include <iostream> #include <boost/shared_ptr.hpp> using namespace std; using boost::shared_ptr; template< typename T > class monitor; template< typename T > class locker { shared_ptr< T > shared_obj_; public: locker( shared_ptr< T > &shared_obj ) : shared_obj_( shared_obj ) { shared_obj_->lock(); } ~locker() { shared_obj_->unlock(); } shared_ptr< T > operator->() { return shared_obj_; } }; template< typename T > class monitor { shared_ptr< T > shared_obj_; public: monitor( T * t ) : shared_obj_( shared_ptr< T >( t ) ) { } locker< T > operator->() { return locker< T >( shared_obj_ ); } }; struct mutex { void lock() { cout << "object locked \n"; } void unlock() { cout << "object unlocked \n"; } }; struct Q : mutex { void ModifyObject() { cout << "Object modified \n"; } }; int main( int argc, char * argv[] ) { monitor< Q > m( new Q ); m->ModifyObject(); return 0; }