C++ 在c+中强制执行空检查+;

C++ 在c+中强制执行空检查+;,c++,pointers,boost,C++,Pointers,Boost,我的方法可以返回某种类型的指针(例如boost::shared_ptr),该指针可能为空。有没有办法强制我的代码的用户检查代码是否为空 例如,scals的Option容器可能是boost的boost::Option?您可以执行以下操作: 返回一个智能指针类型,该类型在被访问并设置为NULL时引发异常 抛出异常而不是返回空指针 返回一个std::optional(或boost::optional),它比指针更好地表达意图(即“可能缺少值”) 您可以执行以下操作: 返回一个智能指针类型,该类型在

我的方法可以返回某种类型的指针(例如boost::shared_ptr),该指针可能为空。有没有办法强制我的代码的用户检查代码是否为空


例如,scals的Option容器可能是boost的boost::Option?

您可以执行以下操作:

  • 返回一个智能指针类型,该类型在被访问并设置为NULL时引发异常
  • 抛出异常而不是返回空指针
  • 返回一个std::optional(或boost::optional),它比指针更好地表达意图(即“可能缺少值”)

您可以执行以下操作:

  • 返回一个智能指针类型,该类型在被访问并设置为NULL时引发异常
  • 抛出异常而不是返回空指针
  • 返回一个std::optional(或boost::optional),它比指针更好地表达意图(即“可能缺少值”)

    • 这里的现实是,函数的调用方已经必须进行检查。如果他们试图在不检查的情况下访问共享指针,那么如果底层指针为空,则会出现seg错误


      您不需要指定是在编写库还是在项目中编写某些代码。您也没有指定此代码所处环境的任何细节——所有这些都可能决定我在这种情况下将采用哪种方法——但从广义上讲,utnapistim的所有建议都是好的

      实际情况是,函数的调用者已经需要检查了。如果他们试图在不检查的情况下访问共享指针,那么如果底层指针为空,则会出现seg错误


      您不需要指定是在编写库还是在项目中编写某些代码。您也没有指定此代码所处环境的任何细节——所有这些都可能决定我在这种情况下将采用哪种方法——但从广义上讲,utnapistim的所有建议都是好的

      通常的解决方案是将返回值包装在一个类中 包含一个标记,该标记在选中或删除指针时设置 已复制,如果未设置标志,其析构函数将崩溃。 比如:

      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;
          }
      };
      
      模板
      必须检查班级
      {
      T*myValue;
      已检查可变布尔值;
      公众:
      必须检查(T*值)
      :myValue(值)
      ,Myhasbeen已检查(假)
      {
      }
      必须检查(必须检查常数和其他)
      :myValue(other.myValue)
      ,Myhasbeen已检查(假)
      {
      other.myHasBeenChecked=true;
      }
      ~MustBeChecked()
      {
      断言(myHasBeenChecked);
      }
      布尔运算符==(nullptr_t)常量
      {
      myHasBeenChecked=true;
      返回myValue==nullptr;
      }
      布尔运算符!=(nullptr\t)常量
      {
      myHasBeenChecked=true;
      返回myValue!=nullptr;
      }
      算子T*()常数
      {
      断言(myHasBeenChecked);
      返回myValue;
      }
      };
      
      坦率地说,我发现这在大多数情况下都是矫枉过正的。但我已经
      可以在一些关键系统上使用它。

      通常的解决方案是将返回值包装在一个类中,这样 包含一个标记,该标记在选中或删除指针时设置 已复制,如果未设置标志,其析构函数将崩溃。 比如:

      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;
          }
      };
      
      模板
      必须检查班级
      {
      T*myValue;
      已检查可变布尔值;
      公众:
      必须检查(T*值)
      :myValue(值)
      ,Myhasbeen已检查(假)
      {
      }
      必须检查(必须检查常数和其他)
      :myValue(other.myValue)
      ,Myhasbeen已检查(假)
      {
      other.myHasBeenChecked=true;
      }
      ~MustBeChecked()
      {
      断言(myHasBeenChecked);
      }
      布尔运算符==(nullptr_t)常量
      {
      myHasBeenChecked=true;
      返回myValue==nullptr;
      }
      布尔运算符!=(nullptr\t)常量
      {
      myHasBeenChecked=true;
      返回myValue!=nullptr;
      }
      算子T*()常数
      {
      断言(myHasBeenChecked);
      返回myValue;
      }
      };
      
      坦率地说,我发现这在大多数情况下都是矫枉过正的。但我已经
      看到它在一些关键系统上使用过。

      为什么您希望用户在返回共享\u ptr之前检查post条件而不是检查post条件?您不能强制检查返回类型是否为
      NULL
      。一些编译器提供的最多的功能是警告未使用的函数结果。异常可能更合适吗?“强制我的代码的用户进行检查”-如果检查失败怎么办?为什么要用户检查而不是在返回共享\u ptr之前检查post条件?不能强制检查返回类型是否为
      NULL
      。一些编译器提供的最多的功能是警告未使用的函数结果。异常可能更合适吗?“强制我的代码的用户进行检查”-如果检查失败怎么办?前两个解决方案并没有真正解决这个问题。据推测,在某些情况下,函数应该返回空指针;客户必须进行测试,并在这种情况下采取不同的行为。在异常情况下也可以这样做,但是如果在调用函数中立即进行检查,则会使事情变得特别麻烦。前两种解决方案并没有真正解决这个问题。据推测,在某些情况下,函数应该返回空指针;客户必须进行测试,并在这种情况下采取不同的行为。可以在异常情况下执行此操作,但如果在调用函数中立即进行检查,则会使事情变得特别麻烦。