我的方法可以返回某种指针(例如boost :: shared_ptr),这个指针可能是NULL。有没有办法强制我的代码用户检查,如果它是空的?
这类事情的一些例子 - scals的Option容器,可能是boost有类似boost :: option吗?
答案 0 :(得分:2)
您可以执行以下操作:
答案 1 :(得分:2)
通常的解决方案是将返回值包装在一个类中 包含一个标志,如果指针被选中则设置该标志 复制,如果没有设置标志,其析构函数会崩溃。 类似的东西:
template <typename T>
class MustBeChecked
{
T* myValue;
mutable bool myHasBeenChecked;
public:
MustBeChecked( T* value )
: myValue( value )
, myHasBeenChecked( false )
{
}
MustBeChecked( MustBeChecked const& other )
: myValue( other.myValue )
, myHasBeenChecked( false )
{
other.myHasBeenChecked = true;
}
~MustBeChecked()
{
assert( myHasBeenChecked );
}
bool operator==( nullptr_t ) const
{
myHasBeenChecked = true;
return myValue == nullptr;
}
bool operator!=( nullptr_t ) const
{
myHasBeenChecked = true;
return myValue != nullptr;
}
operator T*() const
{
assert( myHasBeenChecked );
return myValue;
}
};
坦率地说,我发现在大多数情况下这都是矫枉过正的。但我已经
看到它用在一些关键系统上。
答案 2 :(得分:1)
这里的现实是你的功能的来电者已经必须检查。如果他们试图在不进行检查的情况下访问共享指针,那么如果底层指针为NULL,则会出现seg-fault。
您没有指定是否正在编写库或项目中的某些代码。你也没有详细说明这个代码所处的背景 - 所有这些都可能决定我在这种情况下采取的方法 - 但从广义上讲,所有utnapistim的建议都是好的。