Подклассы и get_shared_from_this()

Мне нужно найти решение, позволяющее подклассу получить правильный интеллектуальный указатель.

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. Итак, могу ли я сделать решение, которое

  • позволяет мне использовать общие указатели для слушателей (поскольку эти слушатели также используются в других контекстах интеллектуальных указателей),
  • позволяет мне шаблонировать Notifier и слушателей, используя сам тип сообщения для шаблона, так что очень легко прослушивать определенные сообщения, и поэтому мне не нужно декодировать сообщение, а
  • просто?

Я открыт для других идей, но если мне удастся заставить это работать, я буду в восторге.

7
задан whiterook6 19 March 2012 в 19:45
поделиться