我有一个用于组合值和错误代码的类。在缩小的形式中它看起来像这样:
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。
答案 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>()};