передать владение unique_ptr указателю на потомка
Имеется типичная фабрика:
struct A;
struct B;
struct Base {
int y;
static std::unique_ptr<Base> create( size_t n );
virtual ~Base() { }
};
struct A : public Base {int a; virtual ~A(){};};
struct B : public Base {int b; virtual ~B(){};};
std::unique_ptr<Base> Base::create( size_t n ){
if( n == 1 ) return std::unique_ptr<Base>(new A );
else return std::unique_ptr<Base>(new B );
}
При создании конкретного класса (A) потребовалось обратится к его уникальному полю (a). Решения этого вопроса удалось выполнить путем извлечения сырого указателя:
auto x = static_cast<A*>( Base::create(1).get() );
x->y=1;
x->a=2;
Но, что-то не нравиться мне такое решение, в дальнейшем с указателем x будут реализованы сложные алгоритмы. Переходить на shared_ptr тоже вроде смысла нет, т.к. создали один единственный указатель и с ним работаем.
Можно ли воспользоваться move? как то так
std::unique_ptr<A> z = std::move( x );
z->a=2;