2016-12-27 167 views
1

如何轉換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 '是正確的方法。 –

回答

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結果不確定的行爲。

你的問題的一般主題是,你正試圖查看資源管理處理程序的一件事,就好像它是爲另一個相關的事情。這是一個有問題的概念,因爲處理程序確實需要知道它究竟處理了什麼,而且它在某種程度上忽略了這一點。你真正想要做的是溝通處理事情的看法。在當前的情況下,您可以使用通常的語言規則(如預期的那樣工作並避免討論處理程序對象(唯一指針))來處理指針,並將轉換爲指針const T

+0

[Demo](https://ideone.com/kOMvYg) –

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

如果要移動的對象,然後看到其他的答案。

相關問題