直接看代码,代码说明一切
#include <functional>
#include <iostream>
using namespace std;
class Test
{
public:
double test(int a, int b)
{
cout << "a = " << a << " b = " << b << endl;
return 0;
}
};
double globalTest(int a, int b)
{
cout << "a = " << a << " b = " << b << endl;
return 0;
}
int main(void)
{
// 最普通的用法,直接绑定全局函数
{
// <> 里的返回值和参数需要 和 要绑定的函数参数和返回值对应上
std::function<double(int, int)> f = &globalTest;
f(2, 3);
// 输出 a = 2 b = 3
}
Test t;
// 绑定成员函数
{
std::function<double(Test & obj,int, int)> f = &Test::test;
t.test(1, 2);
// obj 是调用这个函数的对象,这里用t.text,那么obj就是t的引用
// 输出 a = 1 b = 2
}
{
std::function<double()> f = std::bind(&Test::test, &t, 2, 3);
//f(9, 10); // err 编译错误, 函数接收的参数是根据 double() 括号中的参数决定的
f(); // ok 函数接收到的值是 9
// 输出 a = 2 b = 3
}
{
std::function<double(int)> f = std::bind(&Test::test, &t, 5, 6);
//f(); // err 编译错误 参数匹配不上
f(3); // 编译成果,但是 3 被抛弃了,函数接受到的值是 9和10
// 输出 a = 5 b = 6
}
//std::placeholders::_1 占位符
{
std::function<double(int)> f = std::bind(&Test::test, &t, std::placeholders::_1, 15);
f(2); //函数接收到的值是 2 15
//f(2, 10); // err 参数匹配不上 f只接受一个参数
// 输出 a = 2 b = 15
}
{
std::function<double(int, int)> f= std::bind(&Test::test, &t, std::placeholders::_1, std::placeholders::_1);
f(9, 15); // 函数接收到的值是 9, 9
// std::placeholders::_1 占位符接收到的值都是9
// 输出 a = 9 b = 9
}
{
std::function<double(int, int)> f= std::bind(&Test::test, &t, std::placeholders::_2, std::placeholders::_1);
f(9, 15); // 函数接收到的值是 15, 9
// std::placeholders::_1 占位符接收到的值是 15
// std::placeholders::_2 占位符接收到的值是 9
// 输出 a = 15 b = 9
}
return 0;
}
网友评论