C++ C++;自动检测共享的ptr与NULL的比较位置

C++ C++;自动检测共享的ptr与NULL的比较位置,c++,boost,null,shared-ptr,C++,Boost,Null,Shared Ptr,我们有一个大型的遗留代码库,其中包含常用的指针类型,出于各种原因,这些指针类型更适合共享 除了空检查之外,共享指针是常规指针的很好的替代品。 在整个代码中,我们对这些指针进行常规的空检查,在转换到共享ptr之后,这些空检查将始终通过 是否有人有一种很好的方法可以自动检测这些病例: if(foo==NULL)//当foo是boost::shared\u ptr时 ? 我们还没有使用C++11,但很快就会使用 例如: // declared elsewhere as : boost::share

我们有一个大型的遗留代码库,其中包含常用的指针类型,出于各种原因,这些指针类型更适合共享

除了空检查之外,共享指针是常规指针的很好的替代品。 在整个代码中,我们对这些指针进行常规的空检查,在转换到共享ptr之后,这些空检查将始终通过

是否有人有一种很好的方法可以自动检测这些病例: if(foo==NULL)//当foo是boost::shared\u 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();
}
//在别处声明为:boost::shared\u ptr foo;
if(NULL!=foo)//共享时始终为true\u ptr。原始指针时的正确检查
{
foo->DoSomething();
}

如果(foo)应该起作用。此外,如果(foo.get())工作

您可以将所有指针转换为您的类,该类将封装shared_ptr,并重载其“operator==”函数以检测空比较并对其进行计数,或者正确处理它们。您可以继续使用这个代理类,或者在计算(例如转储到日志文件)所有比较之后决定是否切换到共享\u ptr。

一位同事提供了这个解决方案,这正是我想要的: 放入公共标题(并按相反顺序添加参数)

模板
接线员=(int null,const boost::shared_ptr&p)
{   
typedef typename T::故意_错误;
返回false;
}
模板
布尔运算符==(int null,常量boost::shared_ptr&p)
{
typedef typename T::故意_错误;
返回false;
}

在shared_ptr和int之间的所有比较位置出现编译时错误。

“转换为shared_ptr后,这些空检查将始终通过”--您认为如何?请检查以下问题:[1]:[2]:[3]:空在您的系统中是如何键入的?找到定义并将其更改为更安全的内容。您能给出这样一个始终通过检查的示例吗?这并没有回答OP的问题,OP的问题是如何首先检测检查的位置。我喜欢这个和那个:class X{private:struct Y{};private std::shared_ptr s;}并将内联/非内联函数转发给Y函数/数据这是查找它们的一种方法,但让代理类处理所有运算符等会很麻烦。。。与其使用整洁的共享指针,不如用drop代替原始指针。我正在寻找一种方法,当我的团队中的任何人做出这种改变时,总是能够发现问题,而不是我们必须遵循的过程。好吧,在这个代理类上花费一些时间是一次性的,您可以确保将来不会遗漏任何此类错误。一般来说,它太复杂,无法通过一些静态代码分析方法找到,例如int*emptyPtr=NULL;if(aPtr==emptyPtr),或一些复杂的模板代码。
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;
}