Function objects
関数オブジェクト とは、関数呼び出し演算子が定義されている任意のオブジェクトです。C++は多くの組み込み関数オブジェクトを提供するとともに、新しい関数オブジェクトの作成と操作のサポートも提供します。
目次 |
関数呼び出し
|
説明専用の操作
型
|
(C++11以降) |
std::invoke
および
std::invoke_r
(C++23以降)
は、任意の
Callable
オブジェクトを、指定された引数で
INVOKE
および
INVOKE<R>
(C++23以降)
の規則に従って呼び出すことができます。
|
(C++17)
(C++23)
|
任意の
Callable
オブジェクトを指定された引数で呼び出し
戻り値の型を指定する機能を提供
(C++23以降)
(関数テンプレート) |
関数ラッパー
これらの多態的ラッパークラスは、任意の関数オブジェクトを格納するためのサポートを提供します。
|
(C++11)
|
任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート) |
|
(C++23)
|
指定された呼び出しシグネチャで修飾子をサポートする任意の呼び出し可能オブジェクトのムーブ専用ラッパー
(クラステンプレート) |
|
(C++26)
|
指定された呼び出しシグネチャで修飾子をサポートする任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート) |
|
(C++26)
|
任意の呼び出し可能オブジェクトの非所有ラッパー
(クラステンプレート) |
|
(C++11)
|
空の
std::function
を呼び出したときにスローされる例外
(クラス) |
|
(C++11)
|
メンバへのポインタから関数オブジェクトを作成する
(関数テンプレート) |
アイデンティティ
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)
|
Boyer-Moore検索アルゴリズムの実装
(クラステンプレート) |
|
(C++17)
|
Boyer-Moore-Horspool検索アルゴリズムの実装
(クラステンプレート) |
リファレンスラッパー
リファレンスラッパーは、コピー可能な関数オブジェクト内で参照引数を格納することを可能にします:
|
(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 を実装する関数オブジェクト
x
-
y
(クラステンプレート) |
|
|
(C++14)
|
パラメータと戻り値の型を推論する
x
-
y
を実装する関数オブジェクト
(クラステンプレートの特殊化) |
|
x * y を実装する関数オブジェクト
x
*
y
(クラステンプレート) |
|
|
(C++14)
|
パラメータと戻り値の型を推論する
x
*
y
を実装する関数オブジェクト
(クラステンプレートの特殊化) |
|
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 を実装する関数オブジェクト
x
>
y
(クラステンプレート) |
|
|
(C++14)
|
パラメータと戻り値の型を推論する
x
>
y
を実装する関数オブジェクト
(クラステンプレートの特殊化) |
|
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 を実装する関数オブジェクト
!
x
(クラステンプレート) |
|
|
(C++14)
|
パラメータと戻り値の型を推論する
!
x
を実装する関数オブジェクト
(クラステンプレートの特殊化) |
ビット演算 |
|
|
x
&
y
を実装する関数オブジェクト
(クラステンプレート) |
|
|
(C++14)
|
パラメータと戻り値の型を推論する
x
&
y
を実装する関数オブジェクト
(クラステンプレートの特殊化) |
|
x | y を実装する関数オブジェクト
x
|
y
(クラステンプレート) |
|
|
(C++14)
|
関数オブジェクトは
x
|
y
を実装し、パラメータと戻り値の型を推論する
(クラステンプレートの特殊化) |
|
関数オブジェクトの実装
x
^
y
(クラステンプレート) |
|
|
(C++14)
|
関数オブジェクト、パラメータと戻り値の型を推論する
x
^
y
を実装
(クラステンプレートの特殊化) |
|
(C++14)
|
~x を実装する関数オブジェクト
~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
の解決により
共用体を正しく扱わなかった |
正しく扱う |