std::bind_front
| ヘッダ <functional> で定義
|
||
template <class F, class... Args> constexpr /*unspecified*/ bind_front( F&& f, Args&&... args ); |
(C++20以上) | |
関数テンプレート bind_front は f に対する転送呼び出しラッパーを生成します。 このラッパーの呼び出しは args に束縛された最初の sizeof...(Args) 個の引数用いて f を呼ぶことと同等です。
別の言い方をすると、 std::bind_front(f, bound_args...)(call_args...) は std::invoke(f, bound_args..., call_args....) と同等です。
以下のいずれかが false であれば、プログラムは ill-formed です。
std::is_constructible_v<std::decay_t<F>, F>std::is_move_constructible_v<std::decay_t<F>>(std::is_constructible_v<std::decay_t<Args>, Args> && ...)(std::is_move_constructible_v<std::decay_t<Args>> && ...)
引数
| f | - | いくつかの引数に束縛される Callable オブジェクト (関数オブジェクト、関数ポインタ、関数への参照、メンバ関数ポインタ、またはデータメンバポインタ)。 |
| args | - | f の最初の sizeof...(Args) 個の引数に束縛される引数のリスト
|
| 型の要件 | ||
- は MoveConstructible の要件を満たさなければなりません。
| ||
戻り値
未規定な型 T の関数オブジェクト。 ただし同じ引数を用いた2回の std::bind_front の呼び出しから返されるオブジェクトの型は同じです。
返されるオブジェクト (呼び出しラッパー) は以下の性質を持ちます。
std::bind_front の戻り値の型
メンバオブジェクト
返されるオブジェクトは std::forward<F>(f) から直接非リスト初期化された std::decay_t<F> 型のメンバオブジェクト fd および std::tuple<std::decay_t<Args>...>(std::forward<Args>(args)...) を用いて構築された std::tuple オブジェクト tup を保持するかのように振る舞います。 ただし、返されるオブジェクトの代入の動作は未規定です。 また、これらの名前は説明専用です。
コンストラクタ
std::bind_front の戻り値の型は、そのコピー/ムーブコンストラクタがメンバごとのコピー/ムーブを行うかのように振る舞います。 (上で規定されている) すべてのメンバオブジェクトが CopyConstructible の場合は CopyConstructible であり、そうでなければ MoveConstructible です。
メンバ関数 operator()
事前の bind_front(f, args...) の呼び出しから取得したオブジェクト G が与えられ、 G を表す glvalue g が関数呼び出し式 g(call_args...) で呼び出されると、 std::invoke(g.fd, std::get<Ns>(g.tup)..., call_args...)
Nsは整数のパック0, 1, ..., (sizeof...(Args) - 1)です。gは、それが呼び出し式内で lvalue であれば std::invoke 式内で lvalue であり、そうでなければ rvalue です。 そのため、std::move(g)(call_args...)は束縛された引数を呼び出しにムーブできるのに対して、g(call_args...)はコピーを行います。
g が volatile 修飾された型の場合、動作は未定義です。
呼び出す std::invoke 式が noexcept の場合、メンバ operator() は noexcept です (別の言い方をすると、ベースとなる呼び出し演算子の例外指定を維持します)。
例外
格納される関数オブジェクトまたは束縛される引数のいずれかが例外を投げる場合にのみ例外を投げます。
ノート
この関数は std::bind を置き換えることが意図されています。 std::bind と異なり、任意の引数再編成はサポートしませんし、ネストされたバインド式や std::reference_wrapper に対する特別な扱いもありません。 一方、呼び出しラッパーオブジェクトの値カテゴリに注意を払い、ベースとなる呼び出し演算子の例外指定を伝播します。
std::invoke で説明されているように、非静的メンバ関数へのポインタまたは非静的データメンバへのポインタを呼ぶときは、最初の引数はアクセスされるメンバを持つオブジェクトへの参照またはポインタ (std::shared_ptr や std::unique_ptr などのスマートポインタを含む可能性があります) である必要があります。
std::bind_front への引数はコピーまたはムーブされ、 std::ref や std::cref でラップされない限り参照で渡されることはありません。
例
#include <functional>
#include <iostream>
int minus(int a, int b){
return a-b;
}
int main()
{
auto fifty_minus = std::bind_front(minus, 50);
std::cout << fifty_minus (3);
}
出力:
47
関連項目
(C++11) |
関数オブジェクトに1つ以上の引数をバインドします (関数テンプレート) |
(C++11) |
メンバポインタから関数オブジェクトを作成します (関数テンプレート) |