如何将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));
}
答案 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;
}
如果您想移动对象,请查看其他答案。