Raven
Raven

Reputation: 4903

specialized shared_ptr conversion C++0x

This could probably be generalized to any templated class, but I've run into this with shared_ptr. I have class system that goes like:

class A {
protected:
    // some data
}

class B : public A {
    // some access functions
}

class C : public A {
    // some other access functions
}

I'm using this concept because in my library I'm using set of functions that shouldn't be exposed to user, so I divide these functions into two interface classes. Now, I know I could use one class and friends but this would get ugly if more than one class needed to access those functions.

However, I have problem that those classes are passed arround in shared_ptr and I need to retain reference counts (as the data would get destroyed). Therefore I need to convert in this example shared_ptr<B> to shared_ptr<C> and vice versa. Does shared_ptr allow such thing if needed functions are provided and if so what are those? Constructor? Assign operator? Or do I need to go level higher and cast whole pointers instead of just content? I had no luck so far.

And yes if you have a better/more neat method for hiding certain functions I'll be glad to hear it, but I would like to have this question answered too.

Upvotes: 0

Views: 183

Answers (1)

Kerrek SB
Kerrek SB

Reputation: 477060

You want std::static_pointer_cast and std::dynamic_pointer_cast, from <memory>:

struct A {}; struct B : A {};

std::shared_ptr<B> p(std::make_shared<B>());
std::shared_ptr<A> q(std::static_pointer_cast<A>(p));
// now p and q **share** ownership over their pointed-to object.

Upvotes: 5

Related Questions