空参数检查C++

Jef*_*sah 0 c++ parameters null kinematics nullptr

我有一个函数可以解决4个运动方程中的一个.参数是浮点数,有没有办法区分NULL参数和值为0的参数.我已经阅读了主题,似乎NULL和0是相同的.我想区分0和"虚无"形式的原因是因为0值赋值,而"虚无"表示我们不知道该值是什么.

float doSomething(float& foo, float& bar, float& goo, float& baz){
    if(foo == (insert_null_value_here)){
        return (foo_after_we_did_some_equation);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如我已经讨论过的,"null"值不能为NULL或0.如果参数都是指向浮点数的指针,那么如果我检查"nullptrs",这会工作吗?(不是我的主要问题)即使前一个问题是肯定的,我可以将什么值用于非指针/引用类型?(重新主要问题陈述)

Lig*_*ica 6

没有"空参数"这样的东西.那些引用不能完全"为空".

(重要的是不要把它与空指针的想法混为一谈,因为传统原因以前的值为零 - 为了"方便"而将宏NULL定义为零 - 但现在是nullptr.)

如果要使这些值可选,请使用boost::optional,它形成数据成员的包装,以及指示是否填充成员的布尔值:

float doSomething(boost::optional<float>& foo)
{
   if (foo) {
      return someEquation(foo.get());
   }

   return somethingElse();
}
Run Code Online (Sandbox Code Playgroud)

现在,有效值为:

  • 3.5f
  • 42
  • 0
  • -5

而且根本没有传递任何价值:

  • boost::none

如果你想保持ref-to-non const,你会做类似的事情:

boost::optional<float> myValue = 3;  // or 42, or 5.1, or boost::none
doSomething(myValue);
Run Code Online (Sandbox Code Playgroud)

boost::optional几乎std::optional与C++ 14一样,但它现在是Library Fundamentals TS的一部分,我们希望它能够完全融入C++ 17.


Swt*_*svn 5

在这里加2美分.

您也可以直接使用指针,并为您不想为其发送值的参数发送nullptr.这是,如果您不想将Boost包含在次要功能中.

您也无法检查nullptr的引用.默认情况下,它们应该具有适当的地址.