2014-12-29 78 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是實際參數? –