我们有一个庞大的遗留代码库,其中包含常见的指针类型,由于各种原因,它们更适合作为shared_ptrs。
除了NULL检查之外,shared_ptrs是常规指针的良好替代品。 在整个代码中,我们对这些指针进行定期的NULL检查,在转换为shared_ptrs之后,这些空值检查将始终通过。
有没有人能够自动检测这些情况: if(foo == NULL)//当foo是boost :: shared_ptr时 ?
我们还没有使用C ++ 11,但很快就会出现。
示例:
// declared elsewhere as : boost::shared_ptr<T> foo;
if (NULL != foo) //always true when shared_ptr. Correct check when raw pointer
{
foo->DoSomething();
}
答案 0 :(得分:3)
你可以将所有指针转换为你的类,它将封装shared_ptr,并重载它的“operator ==”函数来检测NULL比较并计算它们,或者正确处理它们。您可以坚持使用此代理类,也可以在计数之后(例如转储到日志文件中),所有比较都决定是否切换到shared_ptr。
答案 1 :(得分:1)
一位同事提供了这个解决方案,这正是我所追求的: 放入一个公共标题(并以相反的顺序添加参数)
template<typename T>
bool operator!=(int null, const boost::shared_ptr<T>& p)
{
typedef typename T::intentional_error error;
return false;
}
template<typename T>
bool operator==(int null, const boost::shared_ptr<T>& p)
{
typedef typename T::intentional_error error;
return false;
}
在shared_ptr和int之间的所有比较位置给出编译时错误。
答案 2 :(得分:-2)
if(foo)应该有效。如果(foo.get())工作