使用派生中的unique_ptr <data>“向下转换” unique_ptr <base />到unique_ptr <derived>

时间:2018-12-26 03:26:11

标签: c++ c++11 smart-pointers unique-ptr

“Downcasting” unique_ptr< Base > to unique_ptr< Derived >提供了一种向下转换unique_ptr的优雅解决方案。它在大多数时间都有效。但是,当“派生”包含unique_ptr时,就会出问题:

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del> 
static_unique_ptr_cast( std::unique_ptr<Base, Del>&& p )
{
    auto d = static_cast<Derived *>(p.release());
    return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter()));
} 

struct Data
{
   int data;
};

struct Base
{
};

struct Derived : public Base
{
    Derived() 
        : data(std::make_unique<Data>())

    std::unique_ptr<Data> data;
};

int main()
{
    std::unique_ptr<Base> base = std::make_unique<Derived>();

    auto data = static_unique_ptr_case<Derived>(std::move(base))->data; // compile error

    return 0;
}

是否有更好的方法来解决此问题?

Eidt:

修正错别字并

@Igor Tandetnik 提供解决方案

std::unique_ptr<Base> base = std::make_unique<Derived>();

//auto& data = static_unique_ptr_case<Derived>(std::move(base))->data; // compile error

auto derived = static_unique_ptr_case<Derived>(std::move(base));

auto& data = derived->data;

return 0;

1 个答案:

答案 0 :(得分:0)

在线文档说明了有关unique_ptr的信息:

  

该类满足MoveConstructible和MoveAssignable的要求,但不满足CopyConstructible或CopyAssignable的要求。

因此,您无法在该行中尝试复制构造或复制分配android:enabled="false"

unique_ptr