2014-12-29 122 views
0

我有一个函数可以解出4个运动方程之一。参数是浮动,有没有办法区分一个NULL参数和值为0.我已经读过这个主题,看起来NULL和0是相同的。我想将0与“虚无”形式区分开来的原因是因为0值赋值而“虚无”表明我们不知道该值是什么。空参数检查C++

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”是否会工作?(不是我的主要问题)即使前面的问题是肯定的,我可以使用非指针/引用类型的值吗?主要问题陈述)

+0

请随时质疑进一步澄清。 –

+0

你不能检查引用对'NULL',你可以尝试的是'if(&foo == NULL)' –

+3

@πάνταῥεῖ为什么在这里是合理的? – 0x499602D2

回答

5

在这里添加我的2美分。

你也可以直接使用指针,并发送nullptr给你不想发送值的参数。这是,如果你不想包括提升次要功能。

此外,你不能检查nullptr的参考。他们应该默认有一个正确的地址。

+1

参考资料没有地址。 –

+0

我不得不说,Boost是非常有用的,但不是这样一个小功能,我希望能够以简单的方式更改浮点值。 –

+0

@LightnessRacesinOrbit操作符的地址'&'对它们的工作原理是一样的。 –

6

没有“空参数”这样的东西。那些引用不能顺从地“变为空”。

(这不是一个空指针,它曾经有过价值遗留原因—与中定义的宏NULL的想法混为一谈这是为“方便” —是很重要的,但现在是nullptr 。)

如果你想使这些值可选,使用boost::optional,形成指示成员是否填充围绕数据成员和一个布尔值的包装:

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

    return somethingElse(); 
} 

现在,有效值为:

  • 3.5f
  • 42
  • 0
  • -5

而且通过没有价值可言:

  • boost::none

如果你想保留裁判对非const,你会做这样的事情:

boost::optional<float> myValue = 3; // or 42, or 5.1, or boost::none 
doSomething(myValue); 

boost::optional was nearly std::optional as of C++14, but is now part of the Library Fundamentals TSwe hope will make it, in entirety, into C++17

+0

*“boost :: optional差不多是std :: optional”* ...这似乎很常见,请看''。 'boost'似乎是'C++'beta操场。 (注意这个评论与你的帖子无关,它只是让我一边咆哮) – CoryKramer

+1

@Cyber​​:Boost绝对是C++标准库游乐场。 :) –

+0

如果foo = 0,它不会被认为是错误的?只有在boost :: none是实际参数? –