将 vector<unique_ptr<T>> 转换为 vector<unique_ptr<const T>>
convert vector<unique_ptr<T>> to vector<unique_ptr<const T>>
如何将 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;
}
如果要移动对象,请查看其他答案。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中