如何接受派生的`shared_ptr`到接受`T const&`的构造函数?

时间:2017-05-27 06:08:56

标签: c++

我有一个用于组合值和错误代码的类。在缩小的形式中它看起来像这样:

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类还必须接受shared_ptr以外的类型,例如普通的struct / class types。

2 个答案:

答案 0 :(得分:0)

添加模板化构造函数(可选择完美转发):

if message.ReceiverId != self.loggedInUserUid {
// Code to be executed...
} else if message.senderId != self.loggedInUserUid {
// Other code to be executed...
}

这允许您的包装器由可转换为其成员类型的任何东西构成。请注意,您可能需要一些额外的SFINAE逻辑才能从此模板化构造函数中排除复制/移动构造函数。

答案 1 :(得分: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>>,或者返回shared_ptr<base const>,如下所示:

return shared_ptr<base const>{make_shared<derived>()};