【问题标题】:cast std::vector<std::shared_ptr<T>> to std::vector<std::shared_ptr<const T>>将 std::vector<std::shared_ptr<T>> 转换为 std::vector<std::shared_ptr<const T>>
【发布时间】:2019-10-20 06:14:14
【问题描述】:

我有三个班级成员:

public:
    std::vector<std::shared_ptr<Object> > getObjects();
    std::vector<std::shared_ptr<const Object> > getObjects() const;

private:
    std::vector<std::shared_ptr<Object> > m_objects;

当我在const 版本的getObjects() 中返回m_objects 时出现编译器错误,因为m_objects 与返回类型(std::vector&lt;std::shared_ptr&lt;const Object&gt;&gt;) 不匹配。

在我的解决方法中,我首先通过迭代在本地重建对象向量,然后返回本地向量,但是是否有更优化的方法来处理这种情况?

std::vector<std::shared_ptr<const Object> > objects;
for (auto & object: m_objects)
{
    objects.push_back(object);
}
return objects;

【问题讨论】:

  • 恐怕不行。这些是不相关的类型。
  • 好的,但是我想局部变量的内容不会被复制而是在将变量分配给getObjects()的情况下移动,例如auto objects = objectManager->getObject();,其中objectManager 是一个 const 指针。
  • 一种解决方案是不返回vector,而是将类本身设为into a container。请注意,这可能会背叛课程的意图并使事情变得过于复杂。
  • 简单的return {m_objects.begin(), m_objects.end()};怎么样?

标签: c++ c++11 casting smart-pointers


【解决方案1】:

您不能从std::vector&lt;std::shared_ptr&lt;T&gt;&gt; 转换为std::vector&lt;std::shared_ptr&lt;const T&gt;&gt;,即使reinterpret_cast 会产生未定义的行为。有关详细信息,相关问题cast vector&lt;T&gt; to vector&lt;const T&gt; 可能会有所帮助。

创建副本是您能做的最好的事情。但是,正如弗兰克指出的那样,它可以更简洁地写成return {m_objects.begin(), m_objects.end()}。这也避免了一些不必要的分配,因为最终容器的大小是立即知道的(与push_back 方法相反)。

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2015-07-23
    • 2017-09-01
    相关资源
    最近更新 更多