Documentation Home >> Headers >> <jss/experimental_atomic.hpp> Header >> std::experimental::enable_shared_from_this class template

The enable_shared_from_this class template allows member functions of an object to retrieve a std::experimental::shared_ptr object that pointers to this and shares ownership with other std::experimental::shared_ptr objects that own this without needing direct access to one of those std::experimental::shared_ptr objects.

template<typename Derived>
class enable_shared_from_this{
protected:
    constexpr enable_shared_from_this() noexcept;
    enable_shared_from_this(enable_shared_from_this const&) noexcept;
    enable_shared_from_this& operator=(enable_shared_from_this const&);
    ~enable_shared_from_this() noexcept;
public:
    shared_ptr<Derived> shared_from_this();
    shared_ptr<Derived const> shared_from_this() const;
};
Usage

To use enable_shared_from_this in a class X, publicly derive that class from enable_shared_from_this<X>:

class X: public std::experimental::enable_shared_from_this<X>{
    // whatever
};

For any X objects which are owned by std::experimental::shared_ptr instances constructed directly from a raw X pointer, or via std::experimental::make_shared<X>, the shared_from_this member function can be used to retrieve a std::experimental::shared_ptr instance that shares ownership with the other std::experimental::shared_ptr instances that own this.

e.g.

class X: public std::experimental::enable_shared_from_this<X>{
public:
    std::experimental::shared_ptr<X> foo();
};

std::experimental::shared_ptr<X> X::foo(){
    return shared_from_this();
}

std::experimental::shared_ptr<X> p(new X);
std::experimental::shared_ptr<X> p2=p->foo();
assert(p.use_count()==2);
Header

#include <experimental/atomic>

See Also