関数オブジェクト
「関数オブジェクト」(function object) は、関数呼び出し演算子が定義されたあらゆるオブジェクトのことです。C++は多くの組み込み関数オブジェクトを提供しており、また新しい関数オブジェクトの作成と操作をサポートしています。
目次 |
[編集] 関数の呼び出し
|
説明専用の操作である arg_0 の非修飾型を
|
(C++11以降) |
std::invoke と std::invoke_r(C++23以降) は、INVOKE と INVOKE<R>(C++23以降) の規則に従って、任意の呼び出し可能 (Callable) オブジェクトを所与の引数で呼び出すことができます。
| (C++17)(C++23) |
任意の呼び出し可能 (Callable)オブジェクトを所与の引数で呼び出す (戻り値の型を指定することも可能)(C++23以降) (関数テンプレート) |
[編集] 関数ラッパー
これらの多相的なラッパークラスは、任意の関数オブジェクトを格納するためのサポートを提供します。
| (C++11) |
コピー構築可能な任意の呼び出し可能オブジェクトをラップするコピー可能なラッパー (クラステンプレート) |
| (C++23) |
与えられた呼び出しシグネチャで修飾子をサポートする任意の呼び出し可能オブジェクトのムーブ専用ラッパー (クラステンプレート) |
| (C++26) |
所与の呼び出しシグネチャにおける修飾子をサポートする、任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能なラッパー (クラステンプレート) |
| (C++26) |
任意の呼び出し可能オブジェクトの所有権を持たないラッパー (クラステンプレート) |
| (C++11) |
空の std::function を呼び出したときにスローされる例外 (クラス) |
| (C++11) |
メンバへのポインタから関数オブジェクトを生成する (関数テンプレート) |
[編集] 恒等 (Identity)
std::identity は恒等関数オブジェクトです。引数を変更せずにそのまま返します。
| (C++20) |
引数を変更せずにそのまま返す関数オブジェクト (クラス) |
[編集] 部分関数適用
std::bind_front と std::bind は、部分関数適用、つまり関数に引数を束縛して新しい関数を生成するためのサポートを提供します。
| (C++20)(C++23) |
可変個の引数を順番に関数オブジェクトに束縛する (関数テンプレート) |
| (C++11) |
1つ以上の引数を関数オブジェクトに束縛する (関数テンプレート) |
| (C++11) |
オブジェクトが std::bind 式であるか、またはそのように使用できることを示す(クラステンプレート) |
| (C++11) |
オブジェクトが標準のプレースホルダであるか、またはそのように使用できることを示す (クラステンプレート) |
| 名前空間
std::placeholders で定義されています | |
| (C++11) |
std::bind 式における未束縛の引数のためのプレースホルダ(定数) |
[編集] 否定子 (Negators)
std::not_fn は、渡された呼び出し可能オブジェクトの結果を否定する関数オブジェクトを作成します。
| (C++17) |
保持する関数オブジェクトの結果の補数を返す関数オブジェクトを作成する (関数テンプレート) |
[編集] サーチャー
いくつかの文字列探索アルゴリズムを実装したサーチャーが提供されており、直接使用することも、std::search と共に使用することもできます。
| (C++17) |
標準C++ライブラリの探索アルゴリズム実装 (クラステンプレート) |
| (C++17) |
ボイヤー・ムーア法探索アルゴリズム実装 (クラステンプレート) |
| ボイヤー・ムーア・ホースプール法探索アルゴリズム実装 (クラステンプレート) |
[編集] 参照ラッパー
参照ラッパーを使用すると、参照引数をコピー可能な関数オブジェクトに格納できます
| (C++11) |
コピー構築可能 (CopyConstructible) かつ コピー代入可能 (CopyAssignable) な参照ラッパー (クラステンプレート) |
| (C++11)(C++11) |
引数から型を推論して std::reference_wrapper を生成する (関数テンプレート) |
| (C++20)(C++20) |
std::reference_wrapper にラップされた参照型を取得する (クラステンプレート) |
透過的な関数オブジェクト連想コンテナと非順序連想コンテナ(C++20以降)は、異種混合の検索と削除(C++23以降)操作を提供しますが、これらが有効になるのは、提供された関数オブジェクトの型 標準ライブラリのすべての透過的な関数オブジェクト型は、ネストされた型 |
(C++14以降) |
[編集] 演算子関数オブジェクト
C++は、一般的な算術演算と論理演算を表す以下の関数オブジェクトを定義しています。
|
void 特殊化は、引数からパラメータ型と戻り値型を推論し、すべて透過的です。 |
(C++14以降) |
算術演算 | |
| x + y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x + y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x - y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x - y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x * y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x * y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x / y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x / y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x % y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x % y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| -x を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
-x を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
比較 | |
| x == y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x == y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x != y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x != y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x > y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x > y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x < y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x < y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x >= y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x >= y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x <= y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x <= y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
論理演算 | |
| x && y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x && y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x || y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x || y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| !x を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
!x を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
ビット単位演算 | |
| x & y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x & y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x | y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x | y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| x ^ y を実装する関数オブジェクト (クラステンプレート) | |
| (C++14) |
x ^ y を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
| (C++14) |
~x を実装する関数オブジェクト (クラステンプレート) |
| (C++14) |
~x を実装し、パラメータと戻り値の型を推論する関数オブジェクト (クラステンプレート特殊化) |
制約付き比較関数オブジェクト以下の比較関数オブジェクトは制約付きです。
これらの関数オブジェクトはすべて透過的です。
|
(C++20以降) |
ヘルパーアイテム以下の説明専用アイテムは、標準ライブラリのいくつかのコンポーネントで使用されますが、標準ライブラリのインターフェースの一部ではありません。
|
(C++26以降) |
古いバインダとアダプタ初期の関数サポートを提供していたいくつかのユーティリティは、非推奨となり削除されました
|
(C++20まで) | ||||||||||||||||||||||||||||||||||||
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 185 | C++98 | 関数オブジェクトの使用がプログラムの効率を向上させるとされていた | その主張を削除 |
| LWG 660 | C++98 | ビット単位演算用の関数オブジェクトが欠けていた | 追加された |
| LWG 2149 | C++98 | 1つまたは2つの引数を取る関数オブジェクトは、次を要求されていた 引数と結果の型を示すネストされた型を提供すること |
要求されない |
| LWG 2219 | C++11 | INVOKE が std::reference_wrapper を正しく処理していなかった |
正しく処理するように修正 |
| LWG 2420 | C++11 | INVOKE<R> が、R が void の場合に返り値を破棄していなかった |
この場合に返り値を破棄するように修正 |
| LWG 2926 (P0604R0) |
C++11 | 戻り値の型 R を持つ INVOKE 操作の構文がINVOKE(f, t1, t2, ..., tN, R) だった |
次のように変更されたINVOKE<R>(f, t1, t2, ..., tN)
|
| LWG 3655 | C++11 | INVOKE が共用体を正しく処理していなかったLWG issue 2219 の解決による |
正しく処理するように修正 |