いくつかの例やトピックへのリンクを教えてください。
述語は、ブール値またはbool operator()
メンバーを持つオブジェクトを返すC++関数です。単項述語は1つの引数を取り、バイナリは2つの引数を取ります。特定のアルゴリズムについて述語が回答できる質問の例は次のとおりです。
ほとんどすべて STLアルゴリズム は、最後の引数として述語を取ります。
標準、自己定義、および/または述語作成クラスを使用して、新しい述語を構築できます( こちらが良いリファレンスです )。
C++標準では、Predicate
を次のように定義しています(25/7):
Predicateパラメーターは、アルゴリズムが、対応する反復子の逆参照の結果に適用されたときにtrueとしてテスト可能な値を返す関数オブジェクトを予期する場合に使用されます。言い換えると、アルゴリズムがPredicate predを引数として使用し、最初に反復子引数を使用する場合、アルゴリズムは
if (pred(*first)){...}
構造で正しく動作するはずです。関数オブジェクトpred
は、参照解除された反復子を介して非定数関数を適用しません。この関数オブジェクトは、関数へのポインター、または適切な関数呼び出し演算子を持つ型のオブジェクトです。
2つのパラメーターを持つBinaryPredicate
の類似した定義があります。
したがって、英語では、それはoperator()
オーバーロードを持つ関数またはオブジェクトです。
if
ステートメントで真理をテストできる値を返します(したがって、C++の言語規則のため、while
ループなどでも)。さらに、多くのアルゴリズムは実行する操作の正確な順序を指定しないため、述語に一貫性がない場合、つまり結果が呼び出し間で変化する可能性のある入力値以外に依存する場合、予測できない動作が発生することがあります。
アルゴリズムと同様に、論理否定子not1
in <functional>
は、Predicate
テンプレートパラメータを取ります。その場合、追加の要件(20.3/5)があります。
アダプターおよび他のコンポーネントが1つまたは2つの引数を取る関数オブジェクトを操作できるようにするには、関数オブジェクトが、1つの引数を取る関数オブジェクトにtypedefs argument_typeおよびresult_typeを提供し、2つの引数を取る関数オブジェクトにfirst_argument_type、second_argument_type、およびresult_typeを提供する必要があります。
C++(またはコンピューター言語)に固有のものではありません。自然言語の文法では、gate is openなどのステートメントで、is open部分は述語であり、trueまたはfalseであるため、クラスcGate
があったとします、メンバー関数bool cGate::isOpen()
では、そのような関数は述語になります。
基本的に、関数がオブジェクトの状態または値について質問し、結果がtrueまたはfalseの場合、それは述語です。
述語は、入力が条件を満たしているかどうかに応じてtrueまたはfalseを返す単純な関数です。一般的に、述語関数はpure;でなければなりません。 always同じ入力が与えられたときに同じ結果を返す必要があります(したがって、bool isDateInPast(Date &date)
はbad述語になります)。
たとえば、STLソートルーチンのコールバックとして使用されることがよくあります(つまり、「入力a
は入力b
?より小さい」)。