## 3.5 否定素子とバインダ

否定素子とバインダは、既存の関数オブジェクトから新しい関数オブジェクトを作成するために使用される関数アダプタです。ほとんどの場合、否定素子とバインダは、他の関数または汎用アルゴリズムを呼び出す前に、引数リストの作成処理の一部として関数に適用されます。

否定素子 not1() と not2() は、それぞれ単項、2 項の述語関数オブジェクトであり、元のオブジェクトの補数をとる新しい関数オブジェクトを作成します。たとえば、3.3.2.1 節で定義されているウィジェット試験関数オブジェクトを使用すると、次の関数オブジェクトは、ウィジェット試験とまったく同じ引数を持つ 2 項の述語を生成します。

    not2(WidgetTester())

対応するウィジェット試験が偽の場合に真となり、そうでない場合は偽となります。否定素子は、事前にクラス unary_function と binary_function のサブクラスとして定義されている関数オブジェクトでのみ有効です。

バインダは 2 つの引数を持つ関数で、1 番目の引数または 2 番目の引数を特定の値に結合し、その結果、引数が 1 つの関数が生成されます。配下の関数はクラス binary_function のサブクラスでなくてはなりません。バインダ bind1st() は 1 つ目の引数をバインドし、バインダ bind2nd() は 2 つ目の引数をバインドします。

たとえば、バインダ bind2nd(greater<int>(), 5) は 5 より大きい値をテストする関数オブジェクトを作成します。これは、以下のように、5 より大きい値のリストの最初の値を示す反復子を生成するために使用できます。

    list<int>::iterator where = find_if(aList.begin(), aList.end(),
               bind2nd(greater<int>(), 5));

否定素子とバインダを組み合わせると、引数が 3 で割り切れる場合に真となり、そうでない場合に偽となる関数を作成することができます。この関数は、リストから 3 の倍数を削除するために使用することができます。

    list<int>::iterator where = remove_if (aList.begin(), aList.end(),
               not1(bind2nd(modulus<int>(), 3)));

バインダは 2 項関数 `WidgetTester()` へ呼び出しのウィジェット数を結合させるために使用され、ウィジェット引数だけを持つ、引数が 1 つの関数を生成します。これは、指定されたウィジェット型と一致する最初のウィジェットを検出するために使用されます。

    list<Widget>::iterator wehave =
       find_if(on_hand.begin(), on_hand.end(),
          bind2nd(WidgetTester(), wid));

> 注: バインダという用語で記述される概念は、カレーという用語でよく記述されます。これは、一部の人が考えているように、ホットな概念だからという理由からではありません。この名前は、1930 年代に計算理論に大きな影響を与える概念をまとめた書籍の著者であるコンピュータ科学者、Haskell P. Curry の名前に由来しています。Curry 自身はその概念が Moses Schönfinkel のものであると述べていますが、それが本当なら、バインダを Schönfinkel と呼ばないのはなぜかという疑問が残ります。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月