2013-10-22 17 views
2

所以我有一個集合類Foo它採取可移動和(間接)可複製的論點(一類稱爲Image_tstd::unique_ptr<Map>,和地圖可以克隆自己)。排列可移動工程

我想給他們如何創建類的最終用戶的靈活性。所以我有一個「複製式」構造函數和一個「移動式」構造函數:

typdef std::unique_ptr<Map> MapPtr; 

    /// 
    ///@brief Copy build constructor 
    /// 
    Foo(const Image_t& image, const MapPtr& map_ptr) : 
    image_(image), 
    geo_locatormap_(map_ptr->clone()) 
    { 

    } 

    /// 
    ///@brief Move build constructor 
    /// 
    Foo(Image_t&& image, MapPtr&& map_ptr) : 
    image_(std::move(image)) 
    geo_locatormap_(std::move(map_ptr)) 
    { 

    } 

現在理想情況下,我想有Foo(const Image_t& image, MapPtr&& map_ptr)Foo(Image_t&& image, const MapPtr& map_ptr)爲好,但我喜歡這種感覺被複制努力。有沒有快速的方法來做到這一點?或者這種類型的構造函數皺起了眉頭?

回答

3

使用類型推演,完善的轉發和一個小幫手:

static MapPtr&& map_forward(MapPtr&& m) { return std::move(m); } 
static MapPtr map_forward(const MapPtr& m) { return m->clone(); } 

template<typename I, typename M> 
Foo(I&& i, M&& m) : 
image_{std::forward<I>(i)}, 
geo_locatormap_{map_forward(std::forward<M>(m))} 
{ 

} 
+0

很不錯的答案。我沒有想到在我的例子中使用外部幫助函數。你的清潔很多。 – bstamour

+0

@bstamour謝謝。我經常使用小助手,因爲它們也可以更好地擴展,如果您有三個或四個參數,會發生什麼情況。 –

+0

非常真實。我將把這個想法添加到我的工具箱中;) – bstamour

0

這足以定義只有一個版本: Foo(Image_t&& image, MapPtr&& map_ptr)

看看例如在this link瞭解更多詳情。

1

就你而言,既然你不能完全通過map_ptr轉發(除非你像Daniel Frey的回答那樣使用幫助函數),你將需要分別處理這種情況。一種方法我能想到的削減你的構造函數的倒計時二是這樣的:

// Clone the map. 
template <typename Image> 
Foo(Image&& img, MapPtr const& map_ptr) 
    : image_{ std::forward<Image>(img) }, 
     geo_locatormap_{ map_ptr->clone() } 
{ } 

// move the map. 
template <typename Image> 
Foo(Image&& img, MapPtr&& map_ptr) 
    : image_{ std::forward<Image>(img) }, 
     geo_locatormap_{ std::move(map_ptr) } 
{ } 

形象& &語法將綁定到任何左值/右值引用,並與std::forward你會得到最好的操作爲類型。