Namespaces
Variants

Function objects

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )

関数オブジェクト とは、関数呼び出し演算子が定義されている任意のオブジェクトです。C++は多くの組み込み関数オブジェクトを提供するとともに、新しい関数オブジェクトの作成と操作のサポートも提供します。

目次

関数呼び出し

説明専用の操作 INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) は以下のように定義されます:

Obj arg_0 の非修飾型とする(すなわち、 std:: remove_cv < std:: remove_reference < decltype ( arg_0 ) > :: type > :: type

  • std::is_same<C, Obj>::value または std::is_base_of<C, Obj>::value true の場合
  • (obj.*f)(arg_1, arg_2, ..., arg_N) (オブジェクトのメンバ関数を呼び出す)。
  • Obj std::reference_wrapper の特殊化の場合
  • (obj.get().*f)(arg_1, arg_2, ..., arg_N) (特殊な参照先オブジェクトのメンバ関数を呼び出す)。
  • それ以外の場合
  • ((*obj).*f)(arg_1, arg_2, ..., arg_N) (デリファレンスされたオブジェクトのメンバ関数を呼び出す)。
  • std::is_same<C, Obj>::value || std::is_base_of<C, Obj>::value true の場合
  • obj.*mptr (オブジェクトのデータメンバにアクセスします)。
  • Obj std::reference_wrapper の特殊化の場合
  • obj.get().*mptr (特別に参照されたオブジェクトのデータメンバにアクセスします)。
  • それ以外の場合
  • (*obj).*mptr (間接参照されたオブジェクトのデータメンバにアクセスします)。
  • それ以外の場合
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) f ( arg_0, arg_1, arg_2, ..., arg_N ) と等価です(呼び出し可能オブジェクトを呼び出します)。


説明専用の操作 INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) は以下のように定義されます:

  • If R is (possibly cv-qualified) void
  • static_cast < void > ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) ) となります。
  • それ以外の場合
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) が暗黙的に R 型へ変換される。

type Actual decltype ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) ) とする

  • INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) は不適格となる
(C++23以降)
(C++11以降)


std::invoke および std::invoke_r (C++23以降) は、任意の Callable オブジェクトを、指定された引数で INVOKE および INVOKE<R> (C++23以降) の規則に従って呼び出すことができます。

(C++17) (C++23)
任意の Callable オブジェクトを指定された引数で呼び出し 戻り値の型を指定する機能を提供 (C++23以降)
(関数テンプレート)

関数ラッパー

これらの多態的ラッパークラスは、任意の関数オブジェクトを格納するためのサポートを提供します。

(C++11)
任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート)
指定された呼び出しシグネチャで修飾子をサポートする任意の呼び出し可能オブジェクトのムーブ専用ラッパー
(クラステンプレート)
指定された呼び出しシグネチャで修飾子をサポートする任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート)
任意の呼び出し可能オブジェクトの非所有ラッパー
(クラステンプレート)
空の std::function を呼び出したときにスローされる例外
(クラス)
(C++11)
メンバへのポインタから関数オブジェクトを作成する
(関数テンプレート)

アイデンティティ

std::identity は恒等関数オブジェクトです:引数を変更せずにそのまま返します。

(C++20)
引数を変更せずに返す関数オブジェクト
(クラス)

部分関数適用

std::bind_front および std::bind 部分関数適用 のサポートを提供します。すなわち、関数に引数を束縛して新しい関数を生成する機能です。

(C++20) (C++23)
可変個の引数を順に関数オブジェクトにバインドする
(関数テンプレート)
(C++11)
1つ以上の引数を関数オブジェクトにバインドする
(関数テンプレート)
オブジェクトが std::bind 式であるか、またはそのように使用できることを示す
(クラステンプレート)
オブジェクトが標準プレースホルダーであるか、またはそのように使用できることを示す
(クラステンプレート)
名前空間 std::placeholders で定義
std::bind 式内の未バインド引数のためのプレースホルダー
(定数)

否定子 (Negators)

std::not_fn 渡された呼び出し可能オブジェクトの呼び出し結果を否定する関数オブジェクトを生成します。

(C++17)
保持している関数オブジェクトの結果の補数を返す関数オブジェクトを作成する
(関数テンプレート)

サーチャー

複数の文字列検索アルゴリズムを実装したサーチャーが提供されており、直接使用するか、 std::search と共に使用することができます。

標準C++ライブラリの検索アルゴリズム実装
(クラステンプレート)
Boyer-Moore検索アルゴリズムの実装
(クラステンプレート)
Boyer-Moore-Horspool検索アルゴリズムの実装
(クラステンプレート)

リファレンスラッパー

リファレンスラッパーは、コピー可能な関数オブジェクト内で参照引数を格納することを可能にします:

CopyConstructible および CopyAssignable な参照ラッパー
(クラステンプレート)
(C++11) (C++11)
引数から型が推論される std::reference_wrapper を作成する
(関数テンプレート)
std::reference_wrapper でラップされた参照型を取得する
(クラステンプレート)

透過的関数オブジェクト

連想コンテナ および 非順序連想コンテナ (C++20以降) は異種混合ルックアップ と削除 (C++23以降) 操作を提供するが、これらは提供された関数オブジェクト型 T 透過的 である場合にのみ有効になる:修飾識別子 T::is_transparent が有効であり、型を表すこと。

標準ライブラリのすべての透過的関数オブジェクト型は、ネストされた型 is_transparent を定義する。ただし、ユーザー定義の透過的関数オブジェクト型は、 is_transparent を直接ネストされた型として提供する必要はない: T::is_transparent が上記の透過的要件を満たす限り、基底クラスで定義することができる。

(C++14以降)

演算子関数オブジェクト

C++は以下の関数オブジェクトを定義しており、一般的な算術演算と論理演算を表します。

void 特殊化は、そのパラメータ型と戻り値型を引数から推論し、これらはすべて 透過的 である。

(C++14以降)
算術演算
x + y を実装する関数オブジェクト
(クラステンプレート)
パラメータと戻り値の型を推論する x + y を実装する関数オブジェクト
(クラステンプレートの特殊化)
x - y を実装する関数オブジェクト x - y
(クラステンプレート)
パラメータと戻り値の型を推論する x - y を実装する関数オブジェクト
(クラステンプレートの特殊化)
x * y を実装する関数オブジェクト x * y
(クラステンプレート)
パラメータと戻り値の型を推論する x * y を実装する関数オブジェクト
(クラステンプレートの特殊化)
x / y を実装する関数オブジェクト x / y
(クラステンプレート)
パラメータと戻り値の型を推論する x / y を実装する関数オブジェクト
(クラステンプレートの特殊化)
x % y を実装する関数オブジェクト
(クラステンプレート)
パラメータと戻り値の型を推論する x % y を実装する関数オブジェクト
(クラステンプレートの特殊化)
- x を実装する関数オブジェクト
(クラステンプレート)
パラメータと戻り値の型を推論する - x を実装する関数オブジェクト
(クラステンプレートの特殊化)
比較
関数オブジェクトの実装 x == y
(クラステンプレート)
パラメータと戻り値の型を推論する x == y を実装する関数オブジェクト
(クラステンプレートの特殊化)
x ! = y を実装する関数オブジェクト
(クラステンプレート)
パラメータと戻り値の型を推論する x ! = y を実装する関数オブジェクト
(クラステンプレートの特殊化)
x > y を実装する関数オブジェクト x > y
(クラステンプレート)
パラメータと戻り値の型を推論する x > y を実装する関数オブジェクト
(クラステンプレートの特殊化)
x < y を実装する関数オブジェクト x < y
(クラステンプレート)
パラメータと戻り値の型を推論する x < y を実装する関数オブジェクト
(クラステンプレートの特殊化)
関数オブジェクトの実装 x >= y
(クラステンプレート)
パラメータと戻り値の型を推論する x >= y を実装する関数オブジェクト
(クラステンプレートの特殊化)
関数オブジェクトの実装 x <= y
(クラステンプレート)
パラメータと戻り値の型を推論する x <= y を実装する関数オブジェクト
(クラステンプレートの特殊化)
論理演算
x && y を実装する関数オブジェクト
(クラステンプレート)
関数オブジェクトの実装 x && y パラメータと戻り値の型の推論
(クラステンプレートの特殊化)
x || y を実装する関数オブジェクト
(クラステンプレート)
x || y を実装する関数オブジェクト
(クラステンプレートの特殊化)
!x を実装する関数オブジェクト ! x
(クラステンプレート)
パラメータと戻り値の型を推論する ! x を実装する関数オブジェクト
(クラステンプレートの特殊化)
ビット演算
x & y を実装する関数オブジェクト
(クラステンプレート)
パラメータと戻り値の型を推論する x & y を実装する関数オブジェクト
(クラステンプレートの特殊化)
x | y を実装する関数オブジェクト x | y
(クラステンプレート)
関数オブジェクトは x | y を実装し、パラメータと戻り値の型を推論する
(クラステンプレートの特殊化)
関数オブジェクトの実装 x ^ y
(クラステンプレート)
関数オブジェクト、パラメータと戻り値の型を推論する x ^ y を実装
(クラステンプレートの特殊化)
(C++14)
~x を実装する関数オブジェクト ~x
(クラステンプレート)
パラメータと戻り値の型を推論する ~x を実装する関数オブジェクト
(クラステンプレートの特殊化)


制約付き比較関数オブジェクト

以下の比較関数オブジェクトは 制約付き です。

  • 等価演算子 ( ranges::equal_to および ranges::not_equal_to ) は引数の型が equality_comparable_with を満たすことを要求します。
  • 関係演算子 ( ranges::less ranges::greater ranges::less_equal ranges::greater_equal ) は引数の型が totally_ordered_with を満たすことを要求します。
  • 三方比較演算子 ( compare_three_way ) は型が three_way_comparable_with をモデル化することを要求します。

これらの関数オブジェクトはすべて 透過的 です。

x == y を実装する制約付き関数オブジェクト
(クラス)
x ! = y を実装する制約付き関数オブジェクト
(クラス)
x < y を実装する制約付き関数オブジェクト
(クラス)
x > y を実装する制約付き関数オブジェクト
(クラス)
x <= y を実装する制約付き関数オブジェクト
(クラス)
x >= y を実装する制約付き関数オブジェクト
(クラス)
x <=> y を実装する制約付き関数オブジェクト
(クラス)
(C++20以降)


ヘルパーアイテム

以下の説明専用アイテムは標準ライブラリ内のいくつかのコンポーネントで使用されますが、標準ライブラリのインターフェースの一部ではありません。

template < class Fn, class ... Args >

concept /*callable*/ =
requires ( Fn && fn, Args && ... args ) {
std:: forward < Fn > ( fn ) ( std:: forward < Args > ( args ) ... ) ;

} ;
(1) ( 説明専用* )
template < class Fn, class ... Args >

concept /*nothrow-callable*/ =
/*callable*/ < Fn, Args... > &&
requires ( Fn && fn, Args && ... args ) {
{ std:: forward < Fn > ( fn ) ( std:: forward < Args > ( args ) ... ) } noexcept ;

} ;
(2) ( 説明専用* )
template < class Fn, class ... Args >
using /*call-result-t*/ = decltype ( std:: declval < Fn > ( ) ( std:: declval < Args > ( ) ... ) ) ;
(3) ( 説明専用* )
template < const auto & T >
using /*decayed-typeof*/ = decltype ( auto ( T ) ) ;
(4) ( 説明専用* )
(C++26以降)


旧式バインダーとアダプター

初期の機能サポートを提供していたいくつかのユーティリティは非推奨となり削除されました:

基底クラス
(C++11で非推奨) (C++17で削除)
アダプタ互換な単項関数基底クラス
(クラステンプレート)
(C++11で非推奨) (C++17で削除)
アダプタ互換な二項関数基底クラス
(クラステンプレート)
バインダー
(C++11で非推奨) (C++17で削除)
二項関数とその引数の1つを保持する関数オブジェクト
(クラステンプレート)
(C++11で非推奨) (C++17で削除)
二項関数の第1引数を固定
(関数テンプレート)
関数アダプタ
(C++11で非推奨) (C++17で削除)
単項関数へのポインタのアダプタ互換ラッパー
(クラステンプレート)
(C++11で非推奨) (C++17で削除)
二項関数へのポインタのアダプタ互換ラッパー
(クラステンプレート)
(C++11で非推奨) (C++17で削除)
関数ポインタからアダプタ互換な関数オブジェクトラッパーを作成する
(関数テンプレート)
(C++11で非推奨) (C++17で削除)
オブジェクトへのポインタで呼び出し可能な、引数なしまたは単項メンバー関数へのポインタのラッパー
(クラステンプレート)
(C++11で非推奨) (C++17で削除)
オブジェクトへのポインタで呼び出し可能なメンバ関数ポインタからのラッパーを作成する
(関数テンプレート)
オブジェクトへの参照で呼び出し可能な、引数なしまたは単項メンバー関数へのポインタのラッパー
(クラステンプレート)
(C++11で非推奨) (C++17で削除)
オブジェクトへの参照で呼び出し可能なメンバ関数ポインタからのラッパーを作成する
(関数テンプレート)
(C++17で非推奨) (C++20で削除)
保持する単項述語の補数を返すラッパー関数オブジェクト
(クラステンプレート)
(C++17で非推奨) (C++20で削除)
保持する二項述語の補数を返すラッパー関数オブジェクト
(クラステンプレート)
(C++17で非推奨) (C++20で削除)
カスタム std::unary_negate オブジェクトを構築
(関数テンプレート)
(C++17で非推奨) (C++20で削除)
カスタム std::binary_negate オブジェクトを構築する
(関数テンプレート)
(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 の解決により
共用体を正しく扱わなかった
正しく扱う