名前空間
変種
操作

関数オブジェクト

From cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関数オブジェクト
ビット操作 (C++20)
(C++11)
関係演算子 (C++20で非推奨)
 
関数オブジェクト
関数の呼び出し
(C++17)(C++23)
恒等関数オブジェクト
(C++20)
透過的な演算子ラッパー
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

古いバインダとアダプタ
(C++17まで*)
(C++17まで*)
(C++17まで*)
(C++17まで*)  
(C++17まで*)
(C++17*まで)(C++17*まで)(C++17*まで)(C++17*まで)
(C++20まで*)
(C++20まで*)
(C++17*まで)(C++17*まで)
(C++17*まで)(C++17*まで)

(C++17まで*)
(C++17*まで)(C++17*まで)(C++17*まで)(C++17*まで)
(C++20まで*)
(C++20まで*)
 

関数オブジェクト」(function object) は、関数呼び出し演算子が定義されたあらゆるオブジェクトのことです。C++は多くの組み込み関数オブジェクトを提供しており、また新しい関数オブジェクトの作成と操作をサポートしています。

目次

[編集] 関数の呼び出し

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

arg_0 の非修飾型を Obj 型とします (つまり、std::remove_cv<std::remove_reference<decltype(arg_0)>::type>::type)

  • (obj.*f)(arg_1, arg_2, ..., arg_N) (オブジェクト上でメンバ関数を呼び出す)。
  • (obj.get().*f)(arg_1, arg_2, ..., arg_N) (特別に参照されているオブジェクト上でメンバ関数を呼び出す)。
  • それ以外の場合
  • ((*obj).*f)(arg_1, arg_2, ..., arg_N) (間接参照されたオブジェクト上でメンバ関数を呼び出す)。
  • obj.*mptr (オブジェクトのデータメンバにアクセスする)。
  • 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) は、以下のように定義されます。

  • R が (cv修飾されている可能性のある) 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 に暗黙的に変換される。

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::invokestd::invoke_r(C++23以降) は、INVOKEINVOKE<R>(C++23以降) の規則に従って、任意の呼び出し可能 (Callable) オブジェクトを所与の引数で呼び出すことができます。

(C++17)(C++23)
任意の呼び出し可能 (Callable)オブジェクトを所与の引数で呼び出す (戻り値の型を指定することも可能)(C++23以降)
(関数テンプレート) [編集]

[編集] 関数ラッパー

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

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

[編集] 恒等 (Identity)

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

(C++20)
引数を変更せずにそのまま返す関数オブジェクト
(クラス) [編集]

[編集] 部分関数適用

std::bind_frontstd::bind は、部分関数適用、つまり関数に引数を束縛して新しい関数を生成するためのサポートを提供します。

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

[編集] 否定子 (Negators)

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

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

[編集] サーチャー

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

標準C++ライブラリの探索アルゴリズム実装
(クラステンプレート) [編集]
ボイヤー・ムーア法探索アルゴリズム実装
(クラステンプレート) [編集]
ボイヤー・ムーア・ホースプール法探索アルゴリズム実装
(クラステンプレート) [編集]

[編集] 参照ラッパー

参照ラッパーを使用すると、参照引数をコピー可能な関数オブジェクトに格納できます

コピー構築可能 (CopyConstructible) かつ コピー代入可能 (CopyAssignable) な参照ラッパー
(クラステンプレート) [編集]
(C++11)(C++11)
引数から型を推論して std::reference_wrapper を生成する
(関数テンプレート) [編集]
std::reference_wrapper にラップされた参照型を取得する
(クラステンプレート) [編集]

透過的な関数オブジェクト

連想コンテナ非順序連想コンテナ(C++20以降)は、異種混合の検索と削除(C++23以降)操作を提供しますが、これらが有効になるのは、提供された関数オブジェクトの型 T が「透過的」(transparent) である場合のみです。つまり、修飾識別子 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 を実装する関数オブジェクト
(クラステンプレート) [編集]
-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 を実装する関数オブジェクト
(クラステンプレート) [編集]
!x を実装し、パラメータと戻り値の型を推論する関数オブジェクト
(クラステンプレート特殊化) [編集]
ビット単位演算
x & y を実装する関数オブジェクト
(クラステンプレート) [編集]
x & y を実装し、パラメータと戻り値の型を推論する関数オブジェクト
(クラステンプレート特殊化) [編集]
x | y を実装する関数オブジェクト
(クラステンプレート) [編集]
x | y を実装し、パラメータと戻り値の型を推論する関数オブジェクト
(クラステンプレート特殊化) [編集]
x ^ y を実装する関数オブジェクト
(クラステンプレート) [編集]
x ^ y を実装し、パラメータと戻り値の型を推論する関数オブジェクト
(クラステンプレート特殊化) [編集]
(C++14)
~x を実装する関数オブジェクト
(クラステンプレート) [編集]
~x を実装し、パラメータと戻り値の型を推論する関数オブジェクト
(クラステンプレート特殊化) [編集]


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

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

  • 等値演算子 (ranges::equal_toranges::not_equal_to) は、引数の型が equality_comparable_with を満たすことを要求します。
  • 関係演算子 (ranges::lessranges::greaterranges::less_equalranges::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以降)


古いバインダとアダプタ

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

Base
(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++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 INVOKEstd::reference_wrapper を正しく処理していなかった 正しく処理するように修正
LWG 2420 C++11 INVOKE<R> が、Rvoid の場合に返り値を破棄していなかった この場合に返り値を破棄するように修正
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 の解決による
正しく処理するように修正
English 日本語 中文(简体) 中文(繁體)