Как выполнить ковариантные типы возврата при возврате shared_ptr?

using namespace boost;

class A {};
class B : public A {};

class X {
  virtual shared_ptr<A> foo();
};

class Y : public X {
  virtual shared_ptr<B> foo();
};

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

19
задан Kyle 22 April 2010 в 02:02
поделиться

1 ответ

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

Когда Y :: foo возвращает shared_ptr динамическому вызывающему объекту, он должен быть приведен к shared_ptr перед использованием. В вашем случае B * можно (вероятно) просто переинтерпретировать как A * , но для множественного наследования вам понадобится некоторая магия, чтобы сообщить C ++ о static_cast < A *> (shared_ptr :: get ()) .

11
ответ дан 30 November 2019 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: