将矢量>转换为矢量>
问题描述:
如何转换vector<unique_ptr<T>>
至vector<unique_ptr<const T>>
?将矢量<unique_ptr <T>>转换为矢量<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
结果不确定的行为。
你的问题的一般主题是,你正试图查看资源管理处理程序的一件事,就好像它是为另一个相关的事情。这是一个有问题的概念,因为处理程序确实需要知道它究竟处理了什么,而且它在某种程度上忽略了这一点。你真正想要做的是沟通处理事情的看法。在当前的情况下,您可以使用通常的语言规则(如预期的那样工作并避免讨论处理程序对象(唯一指针))来处理指针,并将转换为指针const T
。
+0
[Demo](https://ideone.com/kOMvYg) –
答
假设你不想转移所有权,您可以创建观察指针的向量:
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;
}
如果要移动的对象,然后看到其他的答案。
它只是做'return {some.begin(),some.end()}'吗? –
@BenVoigt:唯一的指针是不可复制的。 –
@Kerrek:对啊。你需要一个移动迭代器适配器。不过,由于'reinterpret_cast'是UB,所以将新的矢量中的所有现有'unique_ptr'移动到'unique_ptr '是正确的方法。 –