std::bind
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <functional> 中定义
|
||
template< class F, class... Args > /*unspecified*/ bind( F&& f, Args&&... args ); |
(1) | (C++11 起) |
template< class R, class F, class... Args > /*unspecified*/ bind( F&& f, Args&&... args ); |
(2) | (C++11 起) |
bind
产生f
转发呼叫的包装。调用此包装是相当于调用f
与它的参数绑定到args
bind
generates a forwarding call wrapper for f
. Calling this wrapper is equivalent to invoking f
with some of its arguments bound to args
. args...
,类似的结构类型std::decay<Arg_i>::type,从std::forward<Arg_i>(arg_i)每一个对象.args...
, of type std::decay<Arg_i>::type, similarly constructed from std::forward<Arg_i>(arg_i).目录 |
[编辑] 参数
f | - | 将被绑定到的一些参数进行调用对象(函数对象,函数指针,引用函数,成员函数的指针,指针到成员数据)
原文: invocable object (function object, pointer to function, reference to function, pointer to member function, or pointer to member data) that will be bound to some arguments |
args | - | 列表中的参数进行绑定,未绑定的参数替换的占位符
_1, _2, _3... 原文: list of arguments to bind, with the unbound arguments replaced by the placeholders _1, _2, _3... |
[编辑] 返回值
T
,其中std::is_bind_expression<T>::value == true,并且可以存储在std::function。该对象f
和所有args
是可移动的,如果是可移动的,否则,是能够复制。该类型定义了以下成员组成:T
, for which std::is_bind_expression<T>::value == true, and which can be stored in std::function. The object is movable if f
and all args
are movable, and is copyable otherwise. The type defines the following members: 的std :: bind的 Return type
Member type result_type
1) If F
is a pointer to function or a pointer to member function, result_type
is the return type of F
. If F
is a class type with nested typedef result_type
, then result_type
is F::result_type
. Otherwise no result_type
is defined.
2) result_type
is exactly R
.
Member function operator()
Given an object g
obtained from an earlier call to bind
, when it is invoked in a function call expression g(u1, u2, ... uM), an invocation of the stored object of type std::decay<F>::type takes place, with arguments defined as follows:
- If the argument is of type
std::reference_wrapper<T>
(e.g. std::ref or std::cref) was used in the initial call tobind
, then the referenceT&
stored in the bound argument is passed to the invocable object. - If std::is_bind_expression<T>::value == true (i.e. another
sbind
subexpression was used as an argument in the initial call tobind
), then that bind-subexpressin is invoked immediately and its result is passed to the invocable object. If the bind subexpression has any placeholder arguments, they are picked fromu1, u2, ...
. - If std::is_placeholder<T>::value != 0 (i.e.,
_1, _2, _3, ...
was used as the argument to the initial call tobind
), then the argument indicated by the placeholder (u1
for_1
,u2
for_2
, etc) is passed to the invocable object as std::forward<Uj>(uj). - Otherwise, the stored argument is passed to the invocable object as-is.
If some of the arguments that are supplied in the call to g()
are not matched by any placeholders stored in g
, the unused arguments are evaluated and discarded.
[编辑] 例外
Arg_i
是第i个类型,arg_i
是第i个参数的Args... args
.Arg_i
is the ith type and arg_i
is the ith argument in Args... args
.[编辑] 注释
_1
的例子)是允许的,但结果却只有明确定义,如果相应的参数(u1
)是一个左值或不可移动的右值._1
's for example) are allowed, but the results are only well defined if the corresponding argument (u1
) is an lvalue or non-movable rvalue.[编辑] 示例
#include <random> #include <iostream> #include <functional> void f(int n1, int n2, int n3, const int& n4, int n5) { std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 << '\n'; } int g(int n1) { return n1; } struct Foo { void print_sum(int n1, int n2) { std::cout << n1+n2 << '\n'; } int data = 10; }; int main() { using namespace std::placeholders; // demonstrates argument reordering and pass-by-reference int n = 7; auto f1 = std::bind(f, _2, _1, 42, std::cref(n), n); n = 10; f1(1, 2, 1001); // 1 is bound by _1, 2 is bound by _2, 1001 is unused // nested bind subexpressions share the placeholders auto f2 = std::bind(f, _3, std::bind(g, _3), _3, 4, 5); f2(10, 11, 12); // common use case: binding a RNG with a distribution std::default_random_engine e; std::uniform_int_distribution<> d(0, 10); std::function<int()> rnd = std::bind(d, e); for(int n=0; n<10; ++n) std::cout << rnd() << ' '; std::cout << '\n'; // bind to a member function Foo foo; auto f3 = std::bind(&Foo::print_sum, foo, 95, _1); f3(5); // bind to member data auto f4 = std::bind(&Foo::data, _1); std::cout << f4(foo) << '\n'; }
输出:
2 1 42 10 7 12 12 12 4 5 1 5 0 2 0 8 2 2 10 8 100 10
[编辑] 另请参阅
(C++11) |
std::bind 表达在未绑定的参数的占位符 原文: placeholders for the unbound arguments in a std::bind expression (常量) |
(C++11) |
创建一个函数对象的指针的成员 原文: creates a function object out of a pointer to a member (函数模板) |