Boost logo

Boost :

From: Steven Watanabe (steven_at_[hidden])
Date: 2007-01-14 18:09:43


AMDG

"Peter Dimov" wrote:
> Avoiding the ... isn't as trivial as it appears. You might want to try
> replacing
>
> inline void sp_enable_shared_from_this( shared_count const & /*pn*/, ... )
> {
> }
>
> with
>
> struct sp_any_pointer
> {
> template<class T> sp_any_pointer( T* ) {}
> };
>
> inline void sp_enable_shared_from_this( shared_count const & /*pn*/,
> sp_any_pointer, sp_any_pointer )
> {
> }
>
> for the _MANAGED case and see if it helps.
Also, you can make the return type non-void and use sizeof to avoid
calling it.

struct enable_shared_from_this_t {
    enable_shared_from_this_t operator,(int);
};

typedef char no;
struct yes { no dummy[2]; };

no test_sp_enable_shared_from_this(enable_shared_from_this_t);

template<class T>
yes test_sp_enable_shared_from_this( T const &);

template<class T, class Y> void sp_enable_shared_from_this( shared_count
const & pn, boost::enable_shared_from_this<T> const * pe, Y const * px )
{
    if(pe != 0)
pe->_internal_weak_this._internal_assign(const_cast<Y*>(px), pn);
}

struct sp_any_pointer
{
    template<class T> sp_any_pointer( T* ) {}
};

inline void sp_enable_shared_from_this( shared_count const & /*pn*/,
sp_any_pointer, sp_any_pointer )
{
}

//inline enable_shared_from_this_t sp_enable_shared_from_this(
shared_count const & /*pn*/, ... );

template<class T, class Y> void
call_sp_enable_shared_from_this_impl( shared_count const & pn, T const *
pe, Y const * px, boost::mpl::true_ )
{
    sp_enable_shared_from_this(pn, pe, px);
}

template<class T, class Y> void
call_sp_enable_shared_from_this_impl( shared_count const &, T const *, Y
const *, boost::mpl::false_ )
{
}

template<class T, class Y> void
call_sp_enable_shared_from_this( shared_count const & pn, T const * pe,
Y const * px)
{
    boost::mpl::bool_<sizeof(
        test_sp_enable_shared_from_this((sp_enable_shared_from_this(pn,
pe, px),0))
    )==sizeof(yes)> condition;
    call_sp_enable_shared_from_this_impl(pn, pe, px, condition);
}

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