Boost logo

Boost :

Subject: [boost] Help with shared_ptr usage?
From: Johnny Willemsen (jwillemsen_at_[hidden])
Date: 2011-06-03 04:20:01


Hi,

I can need some help with getting similar behavior as with shared_ptr
for my classes., I have used std::shared_ptr with C++0x which matches
the boost support.

I have two classes, Base and Derived. Now I want to give our users not
directly access to these implementation classes, but to some reference
to them. I have created two templates, BaseRef_T and Derived_objref (see
below). In Derived_objref I need to add some additional typedefs and
type definitions. I have tried first to add these typedefs to a
specialization of shared_ptr<> but couldn't get a clean solution.

If I now use shared_ptr I can take a shared_ptr for a Derived and assign
it to a BaseRef_T. That works without problems. But how to accomplish
this with my own wrapper classes. This should only be possible when the
types are related to inheritance. If I have now a D that is not derived
from Base than that shouldn't work.

Johnny

#include <memory>

class Base
{
public:
};

class Derived : public virtual Base
{
public:
};

template <typename T>
  class BaseRef_T
  {
  public:
    BaseRef_T (std::shared_ptr <T> t) : impl_ (t) {};
    BaseRef_T (T* t) : impl_ (t) {};
    BaseRef_T (void) : impl_ () {};
    typedef T element_type;
    inline T* operator-> () { return impl_.get ();}
    inline T* get() const { return impl_.get ();}
    explicit operator bool() const // never throws
      { return impl_ == 0 ? false : true; }
    void
    operator=(const std::nullptr_t& t) // never throws
    {
     impl_ = t;
    }

// protected:
    typedef std::shared_ptr <T> shared_ptr_type;
    shared_ptr_type impl_;
  };
typedef BaseRef_T <Base> BaseRef;

template <typename T>
  class Derived_objref
    : public virtual BaseRef_T <T>
  {
  public:
    Derived_objref () : BaseRef_T<T> () {}
    Derived_objref (T *s) : BaseRef_T<T> (s) {}
    Derived_objref (const BaseRef_T <T>& o) : BaseRef_T <T> (o) {}
    void operator=(const std::nullptr_t& t) { this->impl_ = t; }
    typedef int my_index_type; // Needed as additional typedef for Derived
    struct Foo {int a;};
  };
typedef Derived_objref <Derived> DerivedRef;

int main (int,char*[])
{
  std::shared_ptr<Base> bs (new Base);
  std::shared_ptr<Derived> ds (new Derived);
  std::shared_ptr<Base> cs = ds;
  BaseRef b (new Base);
  DerivedRef d(new Derived);
  BaseRef c = d; // <== how to get this working?
  return 0;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk