C++11 std::bind 和 std::placeholder

@time    2019-07-07
@author  Ruo_Xiao

std::bind 则是用来绑定函数调用的参数的, 它解决的需求是我们有时候可能并不一定能够一次性获得调用某个函数的全部参数,通过这个函数, 我们可以将部分调用参数提前绑定到函数身上成为一个新的对象,然后在参数齐全后,完成调用。

std::placeholder,当分批付给函数参数的过程中,如果还没有赋值的参数,使用 std::placeholder 进行占位,意思时该位置的参数现在还不清楚,后期再赋值。

#include 
#include void foo(int a, int b, int c)
{std::cout << "a = " << a << " b = " << b << " c = " << c << std::endl;
}
int main()
{// 将参数 2,3 绑定到函数 foo 参数 b 和 c 上,但是使用 std::placeholders::_1 来对第一个参数进行占位。auto bindFoo = std::bind(foo, std::placeholders::_1, 2, 3);// 这时调用 bindFoo 时,只需要提供第一个参数即可bindFoo(1);return 0;
}

下面是图解 bind 函数部分。

1、bind 可以用来将用户提供的需要一个参数的函数转换成不需要参数的函数对象。绑定的值(在这个例子中是 123)存储在函数对象内并且会被自动传递给用户指定的函数。

2、参数绑定也可以用于将类成员函数转换成零参数的函数对象。猿类们都知道,非静态成员函数需要一个隐式的 this 参数。这意味着需要绑定一个合适的类实例指针到这个函数对象。

3、相应地,隐式的 this 指针也可以显式地传递给需要一个参数的函数对象。

4、函数对象经常同时使用提前绑定的参数和调用时才提供的参数。这个可以用成员函数来实现。

5、当然也可以使用非成员函数。

6、有些时候函数对象被调用时会提供多余的参数,而这些参数是目标函数不需要的。bind 会自动忽略这些多余的参数。

7、这些多余的参数不需要一定在函数对象签名的最后。

8、最后, bind 还允许重新组织函数对象的参数顺序。

 

图解部分转载于:https://www.cnblogs.com/xusd-null/p/3698969.html

 

(SAW:Game Over!)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部