将矢量>转换为矢量>

问题描述:

如何转换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)); 
} 
+0

它只是做'return {some.begin(),some.end()}'吗? –

+0

@BenVoigt:唯一的指针是不可复制的。 –

+0

@Kerrek:对啊。你需要一个移动迭代器适配器。不过,由于'reinterpret_cast'是UB,所以将新的矢量中的所有现有'unique_ptr '移动到'unique_ptr '是正确的方法。 –

您可以通过旧向量的内容移到了构建新的载体:

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

如果要移动的对象,然后看到其他的答案。