
Peter Dimov wrote:
it must go via an analogous mechanism to obtain
WORD* from A*:
// in A friend shared_ptr<WORD> GetData( shared_ptr<A> this_ ) { return shared_ptr<WORD>( &this_->m_wData, boost::bind( &shared_ptr<A>::reset, this_ ) ); }
// in B friend shared_ptr<WORD> GetData( shared_ptr<B> this_ ) { shared_ptr<A> pa( &this_->a, boost::bind( &shared_ptr<B>::reset, this_ ) );
return GetData( pa ); }
Doesn't it bring C++ *polymorphism* to naught? Is it possible to implement the next example using global functions as specified above? class D { private: WORD m_wData; public: D(){ m_wData = 0;} virtual shared_ptr<WORD> GetData( shared_ptr<D> this_ ) { return shared_ptr<WORD>( &m_wData, boost::bind( &shared_ptr<D>::reset, this_ ) ); ); } } class E : public D { private: WORD m_wOtherData; public: virtual shared_ptr<WORD> GetData( shared_ptr<D> this_ ) { return shared_ptr<WORD>( &m_wOtherData, boost::bind( &shared_ptr<D>::reset, this_ ) ); ); } } // usage void SomeFunc( shared_ptr<D> ptrObj) { shared_ptr<WORD> ptrData = ptrObj->GetData( ptrObj); *ptrData = 57; // do the same for all objects } int main() { shared_ptr<D> ptrD(new D); shared_ptr<E> ptrD(new E); SomeFunc( ptrD); SomeFunc( ptrE); } Oleg Fedtchenko The proposed smart pointer member_ptr is described at http://boostoleg.narod.ru/member_ptr.html thread entry http://lists.boost.org/MailArchives/boost/msg72943.php