специализированное shared_ptr преобразование C ++ 0x - PullRequest
0 голосов
/ 03 марта 2012

Вероятно, это можно обобщить для любого шаблонного класса, но я столкнулся с этим с shared_ptr.У меня есть система классов, которая выглядит следующим образом:

class A {
protected:
    // some data
}

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

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

Я использую эту концепцию, потому что в моей библиотеке я использую набор функций, которые не должны быть представлены пользователю, поэтому я делю эти функции на двеинтерфейсные классы.Теперь я знаю, что могу использовать один класс и друзей, но это будет ужасно, если для доступа к этим функциям потребуется более одного класса.

Однако у меня проблема в том, что эти классы передаются вокруг в shared_ptr, и янеобходимо сохранить счетчик ссылок (поскольку данные будут уничтожены).Поэтому мне нужно конвертировать в этом примере shared_ptr<B> в shared_ptr<C> и наоборот.shared_ptr Позволяет ли это, если необходимые функции предоставляются и если да, то что это?Конструктор?Назначить оператора?Или мне нужно подняться на уровень выше и разыгрывать целые указатели, а не просто контент?Мне пока не повезло.

И да, если у вас есть лучший / более аккуратный способ скрытия определенных функций, я буду рад это услышать, но я бы тоже хотел получить ответ на этот вопрос.

1 Ответ

5 голосов
/ 03 марта 2012

Вы хотите std::static_pointer_cast и std::dynamic_pointer_cast, от <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.
...