|
Boost : |
Subject: Re: [boost] [type_erasure] any and shared_ptr
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2012-10-16 12:08:10
AMDG
On 10/16/2012 07:52 AM, Christophe Henry wrote:
> Hi Steven,
>
> I need to use the associated types but don't get them to do what I
> need. Consider
>
> struct Pointee : public boost::enable_shared_from_this<Pointee>
> {
> void foo()
> {
> std::cout << "Pointee::foo called" << std::endl;
> //shared_from_this();
> std::cout << "Pointee::foo end" << std::endl;
> }
> };
>
> Pointee needs to be enable_shared_from_this for some reason, which
> forces me to use it in a shared_ptr. I reused your pointee / pointer
> structures:
>
> <snip>
>
> I (naively) tried to define a pointee concept:
>
> typedef mpl::vector<
> pointer<>,
> same_type<pointer<>::element_type,_a >,
> relaxed_match,
> has_foo<void()>
> > PointeeConcept;
>
> // will not compile, shared_ptr<Pointee> has no foo...
> boost::shared_ptr<Pointee> p (new Pointee) ;
> any<PointeeConcept> ap (p);
> ap.foo();
>
The placeholder _self maps to shared_ptr<Pointee>
and the placeholder _a maps to Pointee.
has_foo<void()> is actually has_foo<void(), _self>
because of the default argument. This says
that shared_ptr<Pointee> has a member called foo.
What you really want is has_foo<void(), _a> to
say that foo is a member of Pointee.
In Christ,
Steven Watanabe
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk