【问题标题】:Implicit conversion of vector<shared_ptr<Foo> > to vector<shared_ptr<const Foo> >vector<shared_ptr<Foo>> 到 vector<shared_ptr<const Foo>> 的隐式转换
【发布时间】:2011-05-18 05:47:01
【问题描述】:

根据this page,您可以将shared_ptr&lt;Foo&gt; 隐式转换为shared_ptr&lt;const Foo&gt;。这很有道理。

但是,当我尝试将包含shared_ptr&lt;Foo&gt;std::vector 转换为包含shared_ptr&lt;const Foo&gt;shared_ptr&lt;const Foo&gt; 时遇到了错误。

有没有实现这种转换的好方法?

【问题讨论】:

    标签: c++ vector casting shared-ptr implicit-conversion


    【解决方案1】:

    否:std::vector&lt;shared_ptr&lt;Foo&gt; &gt;std::vector&lt;shared_ptr&lt;const Foo&gt; &gt; 是不同的类型,因此您不能将一个对象视为另一种类型的对象。

    如果你真的需要std::vector&lt;shared_ptr&lt;const Foo&gt; &gt;,你可以很容易地用shared_ptrs 创建一个与原始元素相同的元素:

    std::vector<shared_ptr<Foo> > v;
    std::vector<shared_ptr<const Foo> > cv(v.begin(), v.end());
    

    但是,如果您根据迭代器编写代码,那么您应该不会有任何问题。也就是说,而不是使用

    void f(const std::vector<shared_ptr<const Foo> >&);
    
    // used as:
    std::vector<shared_ptr<const Foo> > v;
    f(v);
    

    你应该使用

    template <typename ForwardIterator>
    void f(ForwardIterator first, ForwardIterator last);
    
    // used as:
    std::vector<shared_ptr<const Foo> > v;
    f(v.begin(), v.end());
    

    这样,函数f 只需要它获取可用作指向const Foo(或shared_ptr&lt;const Foo&gt;s,如果函数假定该范围包含shared_ptrs)的指针的范围。

    当函数采用范围而不是容器时,您可以将函数与底层数据解耦:数据的实际内容或存储方式不再重要,只要您可以按照自己的方式使用它即可需要使用它。

    【讨论】:

    • 完美答案,谢谢。在使用 std 和 boost 数据结构时,我将开始更频繁地使用迭代器。
    • 当然,f(vector...) 是一个非模板函数,而您的 Iterator fn 是模板化的。现在,如果您要进行模板化,您也可以template &lt;typename ContainerT&gt; void f(ContainerT const&amp;); 并完成迭代器混乱。
    • @Lex:如果您有时间,Visual C++ 团队的 Stephan T. Lavavej 有一系列ten excellent lectures,他在其中讨论了 STL 的设计理念以及如何最好地使用迭代器将数据的存储方式(容器)与数据的使用方式(算法)解耦。
    • @Martin:我不同意。迭代器不必指向容器(或者不必直接来自容器)。变换和过滤迭代器对于在将范围传递给函数之前对其进行处理非常有用。
    • 使用迭代器可能有用,但将函数作为模板是一个非常糟糕的解决方案,除非该函数确实需要许多不同的类型。
    【解决方案2】:

    vector&lt;TYPE&gt;vector&lt;const TYPE&gt; 是两种不同的类型。因此,如果没有 hack 或脏代码,这是不可能

    【讨论】:

      【解决方案3】:

      为什么需要std::vector&lt;shared_ptr&lt;Foo const&gt; &gt;?这 转换很容易;只需使用两个迭代器构造函数 std::vector。但在许多情况下,您不需要它:通常, const-correctness 与动态分配无关 对象,如果你需要一个shared_ptr&lt;Foo const&gt;,有一个 当您从 向量。

      【讨论】:

        猜你喜欢
        • 2011-12-20
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 2019-10-20
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 2017-07-18
        相关资源
        最近更新 更多