C++1z not_fn

これまで、述語(predicate)を反転させるためには、std::not1()std::not2()という関数がありました。

これらの関数はそれぞれ1引数の述語関数オブジェクト、2引数の述語関数オブジェクトを対象としますが、C++11で導入された可変引数テンプレートがあれば、任意の引数を受け取る述語を扱えます。そのため、新たにstd::not_fn()という関数が定義されるようになります。

// <functional>
namespace std {
  template <class F>
  unspecified not_fn(F&& f);
}

この関数には、可変引数テンプレートの制限に引っかかることのない限り、任意の数の引数を受け取る述語関数オブジェクトを指定できます。

#include <cassert>
#include <functional>

int main()
{
    assert(std::not_fn([] { return true; })() == false);
    assert(std::not_fn([](int) { return true; })(1) == false);
    assert(std::not_fn([](int, int) { return true; })(1, 2) == false);
    assert(std::not_fn([](int, int, int) { return true; })(1, 2, 3) == false);
}

std::not()という関数名にしないのは、not予約語だからです。

std::not_fn()関数の追加にともない、以下の機能は非推奨となります:

  • std::not1()
  • std::not2()
  • std::unary_negate
  • std::binary_nagate
  • 標準関数オブジェクトのresult_typeargument_typefirst_argument_typesecond_argument_type

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。