0

4 つの運動方程式の 1 つを解く関数があります。パラメータは浮動小数点数で、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

「null パラメータ」などというものはありません。これらの参照は、準拠して「null にする」ことはできません。

(これをヌル ポインターの概念と混同しないことが重要です。ヌル ポインターは従来の理由でゼロの値を持っていました— 「利便性」のためにゼロ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

ref-to-non- を保持したい場合はconst、次のようにします。

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

boost::optionalほぼstd::optionalC++14 の時点でしたが、現在は Library Fundamentals TS の一部であり、完全に C++17 になることを願っています

于 2014-12-29T19:41:00.790 に答える
5

ここに私の 2 セントを追加します。

ポインターを直接使用して、値を送信したくないパラメーターに nullptr を送信することもできます。これは、マイナーな機能のために Boost を含めたくない場合のためです。

また、nullptr の参照を確認することはできません。デフォルトでは、適切なアドレスを持っているはずです。

于 2014-12-29T19:52:55.170 に答える