2017-05-27 63 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>()}; 
相关问题