|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2006-12-13 20:36:52
Theodore Witkamp wrote:
> If you notice it's my_weak_ptr not boost::weak_ptr. Which can be used
> in this way due to the implementation of get_pointer for that type.
This is dangerous since you may be left with a dangling this if something
invalidates the weak pointer while you're inside f, but you probably knew
that. (This is the reason why boost::weak_ptr can't be used in this way.)
The "no exceptions" constraint makes it harder than it needs to be. In this
situation I would probably use a null X object:
struct Xb
{
virtual void f() = 0;
};
struct Xn: Xb
{
void f() {} // stub
};
Xn nx;
struct X: Xb
{
void f(); // do real work
};
Xb * lock( my_weak_ptr<Xb> px )
{
return px? get_pointer( px ): &nx;
}
int main()
{
my_shared_ptr<Xb> px( new X );
my_weak_ptr<Xb> wp( px );
function<void()> f = bind( &Xb::f, bind( lock, wp ) );
f();
px.reset();
f();
}
or something like that. Obviously untested. :-)
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk