2017-05-27 78 views
0

我有一個類用於組合一個值和一個錯誤代碼。在減少的形式,它看起來是這樣的:如何接受派生`shared_ptr`到接受`T const&`的構造函數?

template<typename T> 
struct wrapper { 
    T result; 
    err_enum err; 

    wrapper(T const & result) : 
     result(result) { 
     err = err_okay; 
    } 
} 

我有一個使用這個作爲它的返回值的函數:

wrapper<shared_ptr<base const>> foo() { ... } 

我遇到的問題是,一類從base韓元衍生」 t匹配這個隱式的構造函數。我不能這樣做,例如:

return make_shared<derived>(); 

我不得不做的事:

return wrapper<shared_ptr<base const>>(make_shared<derived>()); 

我怎麼能寫我的wrapper類,這樣這個隱式轉換是允許?

請注意,wrapper類還必須接受shared_ptr以外的類型,例如普通結構/類類型。

回答

0

添加模板構造函數(任選完美轉發):

template <typename X> 
wrapper(X && result) : 
    result (std::forward<X>(result)) /* error_code */ {} 

這樣就可以從任何可轉換到它的成員類型構建了您的包裝。但請注意,您可能需要一些額外的SFINAE邏輯,以便從此模板構造函數中排除複製/移動構造函數。

0

對於return make_shared<derived>();,您將返回std::shared_ptr<derived>,但返回類型爲wrapper<shared_ptr<base const>>。然後必須將其隱式轉換爲std::shared_ptr<base const>,然後轉換爲wrapper<shared_ptr<base const>>。但是在一個轉換序列中只允許一個用戶定義的轉換。

爲了解決它,你可以返回一個wrapper<shared_ptr<base const>>明確爲你呈現,或JUSE返回shared_ptr<base const>,如:

return shared_ptr<base const>{make_shared<derived>()}; 
相關問題