
Peter Dimov wrote:
This is a bit harder.
class A { private: WORD m_wData;
private: A();
public: static shared_ptr<A> CreateA() { return shared_ptr<A>(new A); }
friend shared_ptr<WORD> GetData( shared_ptr<A> this_ ) { return shared_ptr<WORD>( &this_->m_wData, boost::bind( &shared_ptr<A>::reset, this_ ) ); } };
int main() { shared_ptr<A> pa = A::CreateA(); shared_ptr<WORD> pw = GetData(pa); pa.reset(); std::cout << "*pw: " << *pw << '\n'; }
Parameter this_ in the function (above) friend shared_ptr<WORD> GetData( shared_ptr<A> this_ ) is an owner of a data member this_->m_wData. But the owner may be not an immediate class-container-of-the-member or its derivative but any arbitrary class like this: class A { public: WORD m_wData; }; class B { public: A a; friend shared_ptr<WORD> GetData( shared_ptr<B> this_ ) { return shared_ptr<WORD>( &this_->a.m_wData, boost::bind( &shared_ptr<A>::reset, this_ ) ); } }; In this case we must create overridden functions for every owner type to correctly specify pointer to a member. And what about when A::m_wData is private? Don't you think this is the better variant: template<class Z> shared_ptr<WORD> A::GetData( shared_ptr<Z> owner ) { return shared_ptr<WORD>( &m_wData, boost::bind( &shared_ptr<Z>::reset, owner ) ); } 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