【问题标题】:How to convert the vecotr of shared_ptr<Derived> to shared_ptr<Base>?如何将 shared_ptr<Derived> 的向量转换为 shared_ptr<Base>?
【发布时间】:2021-06-21 02:26:02
【问题描述】:

我想把shared_ptr&lt;Derived&gt;的向量转换成shared_ptr&lt;Base&gt;的向量:

class Base
{
};
class Derived : public Base
{
};


size_t ConvertVecBasePtr(const vector<std::shared_ptr<Base>>& p)
{
    return p.size();
}


int main()
{
    vector<std::shared_ptr<Derived>> d;
    ConvertVecBasePtr(d);
    return 0;
}

我收到ConvertVecBasePtr 的错误:

错误 C2664: 'size_t ConvertVecBasePtr(const std::vectorstd::shared_ptr> &)': 无法从 'std::vectorstd::shared_ptr>' 到 'const std::vectorstd::shared_ptr> &'

你能帮我解决它吗?例如:我可以使用另一个容器来代替 std::vector 吗?

【问题讨论】:

  • std::shared_ptr&lt;Derived&gt; 可以转换为std::shared_ptr&lt;Base&gt;,但这样的向量是不可转换的。您需要创建一个新向量,您将在其中推送转换后的指针。

标签: c++ vector shared-ptr


【解决方案1】:

您可以像这样构建新的向量:

ConvertVecBasePtr({d.begin(), d.end()});

【讨论】:

    【解决方案2】:

    我知道问题是关于转化,但是否需要转化?如果不是,那么这样的事情可能适用于您的用例(无论是什么),也可能不适用。

    #include <vector>
    #include <type_traits>
    #include <memory>
    
    
    struct Base{};
    
    struct Derived : public Base{};
    
    
    template<typename T>
    typename std::enable_if<std::is_base_of<Base, T>::value, std::size_t>::type
    getSize(const std::vector<std::shared_ptr<T>>& p)
    {
        return p.size();
    }
    
    int main(int, char**)
    {   
        std::vector<std::shared_ptr<Derived>> v{ std::make_shared<Derived>(), std::make_shared<Derived>() };
        auto n = getSize(v);    
        std::cout << "size = " << n << '\n';    
        return 0;
    }
    

    只是一个想法。如果对你没有用,请忘记我曾经说过。

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多