std::placeholders::_1, std::placeholders::_2, ..., std::placeholders::_N
提供: cppreference.com
< cpp | utility | functional
ヘッダ <functional> で定義 | ||
/*see below*/ _1; /*see below*/ _2; | ||
名前空間 std::placeholders はプレースホルダーオブジェクト [_1, . . . _N]
を保持します。 ただし N
は処理系定義の最大値です。
std::bind 式で引数として使用されると、そのプレースホルダーオブジェクトは生成された関数オブジェクトに格納され、その関数オブジェクトが未束縛引数を指定して呼ばれたとき、プレースホルダー _N
はそれぞれ対応する N 番目の未束縛引数で置き換えられます。
各プレースホルダーは extern/*unspecified*/ _1; によって行われたかのように宣言されます。 | (C++17未満) |
プレースホルダーを extern/*unspecified*/ _1; によって宣言することもまだ標準によって認められていますが、処理系は inlineconstexpr/*unspecified*/ _1; によって行われたかのように宣言することが推奨されます。 | (C++17以上) |
プレースホルダーオブジェクトの型は DefaultConstructible かつ CopyConstructible であり、そのデフォルトコピー/ムーブコンストラクタは例外を投げず、またすべてのプレースホルダー _N
について std::integral_constant<int, N> から派生した型 std::is_placeholder<decltype(_N)> が定義されます。
[編集]例
以下のコードはプレースホルダー引数を持つ関数オブジェクトの作成を示します。
Run this code
#include <functional>#include <string>#include <iostream> void goodbye(conststd::string& s){std::cout<<"Goodbye "<< s <<'\n';} class Object {public:void hello(conststd::string& s){std::cout<<"Hello "<< s <<'\n';}}; int main(){typedefstd::function<void(conststd::string&)> ExampleFunction; Object instance;std::string str("World"); ExampleFunction f =std::bind(&Object::hello, &instance, std::placeholders::_1); // equivalent to instance.hello(str) f(str); f =std::bind(&goodbye, std::placeholders::_1); // equivalent to goodbye(str) f(str);return0;}
出力:
Hello World Goodbye World
[編集]関連項目
(C++11) | 関数オブジェクトに1つ以上の引数をバインドします (関数テンプレート) |
(C++11) | オブジェクトが標準のプレースホルダであるか、プレースホルダとして使用できることを表します (クラステンプレート) |
tuple を tie で分解するときに要素をスキップするためのプレースホルダです (定数) |