|
Boost Users : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2005-04-11 13:40:18
Daniel Lidström wrote:
> Hello,
>
> I want to use the shared_ptr with objects that are allocated using
> a factory. The problem is the deallocation. It has to be done with
> a ``manager'' class. For example, here is how the allocation and
> deallocation has to be done:
>
> PxyFileData& geo_file =
> dynamic_cast<PxyFileData&>(fileMan.New("geo"));
> fileMan.Close(geo_file);
>
> I would like to be able to put shared_ptr<PxyFileData>'s into a
> std::vector and then forget about the deallocation. I.e.
> fileMan.Close(...) should be done automatically when the objects
> aren't needed anymore. But since the deallocation isn't simply
> delete, how can I do this?
I assume that FileMan::Close is
void FileMan::Close( FileData& data );
If it took a pointer as an argument, things would be simple:
shared_ptr<PxyFileData> p( &geo_file,
boost::bind( &FileMan::Close, &fileMan, _1 )
);
But since you need a reference, you'd need to use boost::lambda::bind:
namespace ll = boost::lambda;
shared_ptr<PxyFileData> p( &geo_file,
ll::bind( &FileMan::Close, &fileMan, *ll::_1 )
);
or write your own function object:
struct fm_close
{
typedef void result_type;
void operator()( FileMan * pfm, FileData * pfd ) const
{
pfm->Close( *pfd );
}
};
shared_ptr<PxyFileData> p( &geo_file,
boost::bind( fm_close(), &fileMan, _1 )
);
or maybe
struct fm_close
{
FileMan * pfm_;
explicit fm_close( FileMan * pfm ): pfm_( pfm ) {}
void operator()( FileData * pfd ) const
{
pfm_->Close( *pfd );
}
};
shared_ptr<PxyFileData> p( &geo_file, fm_close( &fileMan ) );
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net