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

convert vector<unique_ptr<T>> to vector<unique_ptr<const T>>

本文关键字:gt lt ptr unique vector const 转换      更新时间:2023-10-16

如何将 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));
}

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

#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指针,该指针按照预期的方式工作并避免谈论处理程序(唯一)指针)。

假设您不想转移所有权,则可以创建观察者指针的向量:

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;
}

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