转换矢量<unique_ptr <t>&gt; to vector <unique_ptr <const t =“”>&gt;

时间:2016-12-27 16:19:31

标签: c++ c++11

如何将vector<unique_ptr<T>>转换为vector<unique_ptr<const T>>

使用reinterpret_cast的任何缺点?在C ++ 11和转发中推荐的方法是什么?

vector<unique_ptr<const T>> Get() {
  vector<unique_ptr<T>> some;
  ...
  // Any better way to do this?
  return *(reinterpret_cast<vector<unique_ptr<const T>>*>(&some));
}

2 个答案:

答案 0 :(得分:4)

您可以通过将旧矢量的内容移动到其中来构建新矢量:

#include <iterator>
#include <memory>
#include <vector>

std::vector<std::unique_ptr<T>> v; // ...

std::vector<std::unique_ptr<const T>> cv(
    std::make_move_iterator(v.begin()),
    std::make_move_iterator(v.end()));

您提议的reinterpret_cast会导致未定义的行为。

您的问题的一般主题是,您正在尝试查看资源管理处理程序,就像它是另一个相关的东西一样。这是一个有问题的概念,因为处理程序确实需要知道它究竟处理了什么,并且它在某种程度上忽略了这一点。你真正想要做的是在处理事物上传达一个视图。在当前上下文中,您可以使用处理的事物T指针,并使用通常的语言规则将 转换为const T指针,该规则按预期工作并避免谈论处理程序对象(唯一指针)。

答案 1 :(得分:1)

假设您不想转让所有权,您可以创建一个观察者指针向量:

template<class T>
using const_observer_ptr = const T*;

template<class T>
auto Get() {
    std::vector<const_observer_ptr<T>> some;

    some.resize(source.size());
    std::transform(source.begin(), source.end(), some.begin(),
                   [](auto&& unique) { return unique.get(); });
    return some;
}

如果您想移动对象,请查看其他答案。