当前位置:  开发笔记 > 编程语言 > 正文

来自抽象类的unique_ptr的shared_ptr

如何解决《来自抽象类的unique_ptr的shared_ptr》经验,为你挑选了1个好方法。

我正在尝试遵循Herb Sutter的C++指南,在这种情况下更喜欢unique_ptr原始指针和shared_ptr.赞成的一个论点std::unique_ptrshared_ptr在某些时候需要的可兑换性.

在我来说,我有一个vectorunique_ptr,我需要传递给需要的方法vectorshared_ptr.我希望能写出类似的东西:

for (auto &uniquePtr : vectorUnique)
    vectorShared.push_back(make_shared(move(uniquePtr));

这为我的Xcode 7.1基于工具链配置的以下错误C++11:

错误:字段类型'Abstract'是一个抽象类.

似乎STL Abstract在我使用时试图保持一个具体的类型实例make_shared.这似乎使Sutter先生的建议在许多情况下变得不可行,所以我确信我一定做错了!我求助于写作:

for (auto &uniquePtr : vectorUnique) {
    auto ptr = uniquePtr.get();
    auto shared = shared_ptr(ptr);
    vectorShared.push_back(shared);
    uniquePtr.release();
}

有一个更好的方法吗?



1> Toby Speight..:

make_shared使用给定的参数构造一个新对象并返回一个shared_ptr.所以编译器需要一个构造函数Abstract(std::unique_ptr),这可能不是你拥有的.

你想要的是它的构造函数shared_ptr接受一个unique_ptr参数:

    vectorShared.push_back(shared_ptr(move(uniquePtr)));

而且,事实并非explicit如此

    vectorShared.emplace_back(move(uniquePtr));

只会工作(我曾经emplace_back在Richard Hodges的建议中避免多余的复制).甚至还有一个标准算法,所以你不需要for循环:

    std::move(vectorUnique.begin(), vectorUnique.end(),
              std::back_inserter(vectorShared));

如果您经常需要这个,您可以定义一个函数:

#include 
#include 
#include 

template
std::vector>
        convert_to_shared(std::vector>&& vu)
{
    using std::begin;
    using std::end;
    std::vector> vs;
    vs.reserve(vu.size());
    std::move(begin(vu), end(vu), std::back_inserter(vs));
    return vs;
}


// Example of use
class Abstract {};
int main()
{
    std::vector> vectorUnique;
    std::vector> vectorShared
        = convert_to_shared(std::move(vectorUnique));
}

抱歉这个可怕的名字(我愿意接受建议).如果省略调用reserve(),则可以将其推广到更多容器.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有