C++ 如何将派生的'shared_ptr'接受给接受'T const&;的构造函数?
我有一个类用来组合一个值和一个错误代码。简化形式如下所示:C++ 如何将派生的'shared_ptr'接受给接受'T const&;的构造函数?,c++,C++,我有一个类用来组合一个值和一个错误代码。简化形式如下所示: template<typename T> struct wrapper { T result; err_enum err; wrapper( T const & result ) : result( result ) { err = err_okay; } } 我被迫做: return wrapper<shared_ptr<base co
template<typename T>
struct wrapper {
T result;
err_enum err;
wrapper( T const & result ) :
result( result ) {
err = err_okay;
}
}
我被迫做:
return wrapper<shared_ptr<base const>>(make_shared<derived>());
返回包装器(make_shared());
如何编写我的包装器类,以便允许这种隐式转换
请注意,包装器
类还必须接受除共享\u ptr
以外的类型,例如普通结构/类类型。添加模板构造函数(可以选择完美转发):
模板
包装器(X&&result):
结果(std::forward(result))/*错误代码*/{}
这允许您的包装器由任何可转换为其成员类型的内容构建。但是请注意,您可能需要一些额外的SFINAE逻辑,以便从这个模板化构造函数中排除复制/移动构造函数。Forreturn make_shared()
,您将返回一个std::shared_ptr
,但返回类型为包装器
。然后它必须隐式转换为std::shared_ptr
,然后转换为包装器
。但在一个转换序列中只允许一个用户定义的转换
要解决此问题,您可以按照所示显式返回一个包装器
,或者只返回一个共享的\u ptr
,如:
return shared_ptr<base const>{make_shared<derived>()};
返回shared_ptr{make_shared()};
return wrapper<shared_ptr<base const>>(make_shared<derived>());
template <typename X>
wrapper( X && result) :
result ( std::forward<X>(result)) /* error_code */ {}
return shared_ptr<base const>{make_shared<derived>()};