Мне нужно найти решение, позволяющее подклассу получить правильный интеллектуальный указатель.
class Parent : public enable_shared_from_this {
...
}
class Child : public Parent {
public Child(){
boost::shared_ptr<Parent> pointer=shared_from_this(); // should work
boost::shared_ptr<Child> pointer=shared_from_this(); // won't work.
...
}
Как получить правильный интеллектуальный указатель с помощью shared_from_this()?
КОНТЕКСТ:
Я пишу немного об уведомлении/слушателе, и некоторым классам, естественно, потребуется зарегистрироваться и отменить регистрацию в уведомлении. Например,
class Body : extends Listener<BodyMessage>{ // listen for BodyMessage messages
public:
Body() {
Notifier<BodyMessage>::register(this); // register with the appropriate notifier
}
virtual ~Body {
Notifier<BodyMessage>::unregister(this); // unregister
}
bool notify(BodyMessage m){ ... }
...
}
Обычно я бы просто использовал указатель this, и все было бы хорошо. Я заставил Notifier использовать шаблоны, поэтому я могу передавать сообщения только тем, кто хочет их услышать.
Однако я хочу использовать интеллектуальные указатели. Если уведомитель выглядит так:
template<typename t>
class Notifier {
public:
static void register<boost::shared_ptr<Listener<t>>> boost::shared_ptr<Listener<t>> listener);
...
}
, то я больше не могу использовать указатель this. Естественно, я сделал расширение для Body enable_shared_from_this:
class Body : public boost::enable_shared_from_this, public Listener<BodyMessage> {
public:
Notifier<BodyMessage>::register(get_shared_ptr());
...
}
И, похоже, это работает для Bodies. Однако это не работает для подклассовтел (или, по крайней мере, кажется, что не работает):
class BodyChild : public Body {
public:
BodyChild(){
Notifier<BodyMessage>::register(get_shared_ptr());
}
вероятно, потому что я не могу привести shared_pointer. Итак, могу ли я сделать решение, которое
Я открыт для других идей, но если мне удастся заставить это работать, я буду в восторге.