Превращение между умными указателями

Давайте предполагать, что у нас есть следующие классы:

struct A
{
  virtual ~A() = default;
};

struct B : A
{ };

Кроме того, у нас есть функция фактория, которая возвращает нам умные характерные указатели типа A:

std::shared_ptr<A> FuncionFactoria(int n)
{
  if( n % 2 )
    return std::make_shared<A>();
  else
    return std::make_shared<B>();
}

И, с другой стороны, у нас есть пара функций. Одна допускает умный указатель типа A и другая умный указатель типа B:

void FuncionGenerica(std::shared_ptr<A>);
void FuncionEspecifica(std::shared_ptr<B>);

Как было бы возможно реализовывать безопасное превращение между указателями? Возможный пример использования:

int main()
{
  for( int i=0; i<10; i++ )
  {
    std::shared_ptr<A> aSptr = FuncionFactoria(i);
    std::shared_ptr<B> bSptr = /* ¿¿¿??? */
    if( bSptr )
      FuncionEspecifica(bSptr);

    FuncionGenerica(aSptr);
  }
}

Ощутитесь, что указатели типа A должны быть действительными после превращения...

6
задан 03.05.2017, 18:00
0 ответов