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; によって宣言することもまだ標準によって認められていますが、処理系は inline constexpr /*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(const std::string& s) { std::cout << "Goodbye " << s << '\n'; } class Object { public: void hello(const std::string& s) { std::cout << "Hello " << s << '\n'; } }; int main() { typedef std::function<void(const std::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); return 0; }
出力:
Hello World Goodbye World
[編集] 関連項目
(C++11) |
関数オブジェクトに1つ以上の引数をバインドします (関数テンプレート) |
(C++11) |
オブジェクトが標準のプレースホルダであるか、プレースホルダとして使用できることを表します (クラステンプレート) |
tuple を tie で分解するときに要素をスキップするためのプレースホルダです (定数) |