直接看代码:
#include<iostream>
#include<functional>
using namespace std;
int add(int &a,int &b)
{
a = 0;
b = 0;
return a+b;
}
int main()
{
int a = 2,b = 3;
auto func1 = bind(add,1,2);
cout<<"func1:"<<func1()<<endl;
auto func2 = bind(add,a,b);
cout<<"func2:"<<func2()<<endl;
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
auto func3 = bind(add,std::ref(a),std::ref(b));
cout<<"func3:"<<func3()<<endl;
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
return 0;
}
运行结果:
虽然add函数对的参数是引用类型的,但是通过bind调用之后还是无法引用传递,所以需要std:ref。
下面看一个std:;function与std::bind、std::ref、std::cref结合使用的例子
#include <iostream>
#include <functional>
using namespace std;
int add1(int &a, int &b)
{
a = 0;
b = 0;
return a + b;
}
int add2(const int &a, int &b)
{
//a = 0;
b = 0;
return a + b;
}
int function_add(std::function<int(void)> func)
{
return func();
}
int main()
{
//bind-function
int a = 2, b = 3;
cout << "function_add(std::bind(add1, a, b)):" << function_add(std::bind(add1, a, b)) << endl;
cout << "a:" << a << " b:" << b << endl;
//ref-bind-function
a = 2, b = 3;
cout << "function_add(std::bind(add1, a, b)):" << function_add(std::bind(add1, std::ref(a), std::ref(b))) << endl;
cout << "a:" << a << " b:" << b << endl;
//cref-bind-function
a = 2, b = 3;
cout << "function_add(std::bind(add1, a, b)):" << function_add(std::bind(add2, std::cref(a), std::ref(b))) << endl;
cout << "a:" << a << " b:" << b << endl;
return 0;
}
运行结果:
std::ref 用于包装按引用传递的值。
std::cref 用于包装按const引用传递的值
例子中还用了std::function 来包装分发函数,需要注意的是std::bind转std::function和function的实例调用,如果bind已经将参数全部绑定完成,则function的定义处参数列表为空就行。
人,总是要有一点精神的,不是吗