2017-05-27 12 views
0

私は値とエラーコードを組み合わせるために使用するクラスを持っています。還元された形で、それは次のようになります。`T const&`を受け入れるコンストラクタに派生した `shared_ptr`を受け入れる方法はありますか?

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ウォンに由来していることですこの暗黙のコンストラクタと一致しません。私は、例えば、行うことはできません。

return make_shared<derived>(); 

私がやることを余儀なくしています:

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

この暗黙の変換は許可されているように、どのように私は私のwrapperクラスは書くことができますか?

なお、wrapperクラスは、plain struct/class型など、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>>に変換する必要があります。ただし、1つの変換シーケンスでは1つのユーザー定義変換のみが許可されます。

return shared_ptr<base const>{make_shared<derived>()}; 
:あなたが示したように明示的 wrapper<shared_ptr<base const>>を返すか、日科技連のような shared_ptr<base const>を返すことができ、それを解決するために

関連する問題