#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; //for _1, _2, _3... // demonstrates argument reordering and pass-by-reference int n = 7;
//std::cref是按址传递,其他是按值传递,_2是第二个参数
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
//很简单的生成0-10的随机数
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'; }
Output:
2 1 42 10 7 12 12 12 4 5 1 5 0 2 0 8 2 2 10 8 100 10