我有 boostshared_ptr
作为函数的参数,我希望这个参数有一些默认值。
void foo(boost::shared_ptr<myclass> ptr = nullptr);
因为 ptr 不是指针,而是类..
那我该怎么办?
我发现了一个类似的问题: 默认模板函数参数中的 boost::shared_ptr 和 nullptr
但是那里的解决方案只是切换到std::shared_ptr
,但我做不到
谢谢
我有 boostshared_ptr
作为函数的参数,我希望这个参数有一些默认值。
void foo(boost::shared_ptr<myclass> ptr = nullptr);
因为 ptr 不是指针,而是类..
那我该怎么办?
我发现了一个类似的问题: 默认模板函数参数中的 boost::shared_ptr 和 nullptr
但是那里的解决方案只是切换到std::shared_ptr
,但我做不到
谢谢
用 初始化是完全可以boost::shared_ptr
的nullptr
。它有一个特殊的构造函数:
#if !defined( BOOST_NO_CXX11_NULLPTR )
shared_ptr( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT : px( 0 ), pn() // never throws
{
}
#endif
(以便携式方式boost::detail::sp_nullptr_t
解析)nullptr_t
由于您正在使用nullptr
,您必须使用 C++11,所以您应该能够做到这一点:
void foo(boost::shared_ptr<myclass> ptr = {});
这使得默认参数成为 default-constructed shared_ptr
,与使用 初始化的参数相同nullptr
。它要求您的编译器支持统一的初始化语法,而不是要求您的 Boost 版本支持shared_ptr
从nullptr_t
.
如果您的编译器无法处理,请使用 ForEveR 的答案。
为什么不简单呢?
void foo(boost::shared_ptr<myclass> ptr = boost::shared_ptr<myclass>());
我认为问题不在于“成为类”,而是所涉及的构造函数是明确的。而且您的表单需要隐式转换。您可以使用显式形式来解决它:boost::shared_ptr<myclass>(nullptr)
或 boost::shared_ptr<myclass>()
,无论您的版本支持哪种形式。