2013-11-01 64 views
1

我有兩個匹配向量unique_ptr。我決定通過構造一個包含兩個結構的向量來構建它們(結構體也包含其他項目,最終,因此進行重構)。將包含unique_ptr的結構項添加到stl容器中

對於我在這個矢量中添加新項目的最佳方法是什麼?

我當前的代碼是

std::vector<DestinationObjects> destinations; 
for (unsigned short &id: ids) { 
    DestinationObjects d; 

    d.transmitter = unique_ptr<Transmitter> (new Transmitter(id)); 
    d.controller = unique_ptr<Controller> (new Controller(id)); 

    destinations.push_back(d); 
} 

當然這份d,導致問題與unique_ptr。解決這個問題的最佳方法是什麼?

選項我能想象的,其中有一些我不知道將工作:

  1. 只需切換到shared_ptr。 (一個簡單的發現 - 替換,但感覺像一個cop-out)。
  2. 爲移動unique_ptr的結構編寫移動構造函數。 (另一件事維護,可能會出錯,因爲我展開結構)。
  3. 將unique_ptr的空指針推回空結構實例,並在vector中將它們編輯一次。 (Fiddly語法,我也不確定這甚至會起作用)。

任何想法什麼是另一種方法?或者爲什麼我更喜歡我列出的其中一個?

+1

你認爲你的代碼是由什麼引起的'unique_ptr'問題? – Oswald

+4

隱式移動構造函數應該沒問題,除非你因爲某種原因編寫自己的拷貝構造函數而死掉了它。無論如何,類型必須是可移動的,因爲'vector'在重新分配時需要移動對象。 –

+4

只是...移動它?或者更好的,讓自己像老闆和emplace_back一樣的構造函數。 –

回答

1

簡單做一個vec.emplace_back(std::move(d))

如果(如您的評論中所述)您的編譯器沒有實現隱式移動構造器,請編寫您自己的構造函數move。我將來的建議是,只要您遇到任何C++ 11功能問題並提出問題,請提及您使用的是此編譯器,因爲它很可能是「C++ 11支持」一個重要的問題。

如果您的編譯器根本不支持任何移動構造函數,請停止使用unique_ptr - 如果沒有move構造函數,則它們將毫無用處。 ;)

相關問題