2015-05-27 65 views
0

我有以下的情況:C++鑄造的的unique_ptr <Base>載體來的unique_ptr <Derived>其中衍生是模板

Base是一個基類。 T是可以假設任何派生類Base的模板。

基底層提供我數據從Base類,我需要轉換爲一個特定的類上述層(其中代碼被寫入該層)上,以在用戶級別工作。

下面是代碼:

template <class T> class Access { 
     std::vector<std::unique_ptr<T> getData();   
} 

template <class T> 
std::vector<std::unique_ptr<T> getData() 
{ 
     /// Get data from below layer 
     std::vector<std::unique_ptr<Base>> retData; 

     retData = getDataFromBelowLayer(); 

     /// Now I have to cast Base to T 
     std::vector<std::unique_ptr<T>> retCastData; 

     for (auto &item : retData) 
     { 
      std::unique_ptr<T> = static_cast<T>(item); <<---- NOT WORKING 
      retCastData.push_back(std::move(item)); <<---- NOT WORKING 
     } 

     return retCastData; 
} 

我怎樣纔能有效地施放的接收到的T類型的unique_ptr´svectorBase類的unique_ptr´svector,如圖所示。

感謝您的幫助。

+0

它看起來像通常的'polymorphic_downcast' –

+3

請參閱[這裏](http://stackoverflow.com/questions/21174593/downcasting-unique-ptrbase-to-unique-ptrderived)。 – davidhigh

+1

上面的代碼顯然不是不工作的代碼,因爲它在完全不同的行上有錯誤。請提供實際的最小示例來說明實際問題(以及您嘗試的解決方案),幷包括生成的實際錯誤消息。 – Yakk

回答

4

這樣做:

struct Base {}; 

template<typename T> 
struct Derived : public Base {}; 


template <typename T> 
std::vector<std::unique_ptr<T> > getData() 
{ 
     //add some checking: 
     static_assert(std::is_base_of<Base, T>::value, "T must be derived from Base"); 

     std::vector<std::unique_ptr<Base> > retData; 
     //fill it somehow 

     std::vector<std::unique_ptr<T> > retCastData; 

     for (auto& item : retData) 
     { 
      auto t = std::unique_ptr<T>(static_cast<T*>(item.release())); //(*) 
      retCastData.push_back(std::move(t)); 
     } 

     return retCastData; 
} 

int main() 
{ 
    getData<Derived<int> >(); //or some other type than "int" 
} 

主要的事情發生在標有(*)行。這裏釋放唯一指針並將返回的原始指針下載到派生類,然後插入到該向量中。 (這段代碼的核心是由this thread啓發,但在此省略刪除器的東西。)

注意這樣一個事實,Derived是一個類模板不是什麼問題,一切都在這裏(即在你身邊必須通過Derived</*some type*/>代替DerivedgetData)。

+0

是不是'staric_assert'冗餘,還是過於嚴格?我的意思是'static_cast'會錯誤,如果類型完全不相關? – Yakk

+0

@Yakk:好點。是的,這在技術上是多餘的,但當然還有更詳細的錯誤信息。 – davidhigh

+0

@Yakk:......對我來說,在實踐中是沒有理由添加它的......只是在其餘的之前寫下來,它留在那裏:-) – davidhigh

相關問題