これまで、述語(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_type
、argument_type
、first_argument_type
、second_argument_type
参照
- P0005R0 Adopt
not_fn
from Library Fundamentals 2 for C++17 - P0005R1 Adopt
not_fn
from Library Fundamentals 2 for C++17 - P0005R2 Adopt
not_fn
from Library Fundamentals 2 for C++17 - P0005R3 Adopt
not_fn
from Library Fundamentals 2 for C++17 - P0005R4 Adopt
not_fn
from Library Fundamentals 2 for C++17 - P0358R0 Fixes for
not_fn
- P0358R1 Fixes for
not_fn
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。