0

我有一个函数可以解决 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);
    }
}

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

4

2 回答 2

6

没有“空参数”之类的东西。这些引用不能合规地“为空”。

(重要的是不要将它与空指针的概念混为一谈,空指针的值过去出于遗留原因而为零——为了“方便”而将宏定义为零——但现在NULLnullptr

如果您想让这些值成为可选值,请使用boost::optional,它形成一个数据成员的包装器和一个指示该成员是否已填充的布尔值:

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

   return somethingElse();
}

现在,有效值为:

  • 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);

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

于 2014-12-29T19:41:00.790 回答
5

在这里加上我的 2 美分。

您也可以直接使用指针,并为您不想为其发送值的参数发送 nullptr。这是为了防止您不想将 Boost 包含在一个次要功能中。

您也不能检查 nullptr 的引用。默认情况下,它们应该具有正确的地址。

于 2014-12-29T19:52:55.170 回答