目录
一、std::function
std::function是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。
1.包装普通的函数
std::function<int(int)> callback;
//1.普通的函数
int func(int a){
std::cout<< "func_ a :" << a << endl;
return a;
}
int main()
{
//1.包装普通的函数
callback = func;
callback(10);
return 0;
}
2.包装模板函数
template<class T>
T func_template(T a)
{
std::cout<< "func_template a :" << a << endl;
return a;
}
int main()
{
//2.包装模板函数
callback = func_template<double>;
callback(20.0); //结果为2,这里callback是int类型的,所以都会转成int
return 0;
}
3.包装函数对象
//3.函数对象
class FucntionClass
{
public:
int operator()(int a){
std::cout<< "FucntionClass a :" << a << endl;
return a;
}
};
int main()
{
//3.包装函数对象
callback = FucntionClass();
callback(30);
return 0;
}
4.类模板
template<class T1>
class FunctionClass_template
{
public:
T1 operator()(T1 a){
std::cout<< "template() a :" << a << endl;
return a;
}
static T1 static_func(T1 a){
std::cout<< "template func a :" << a << endl;
return a;
}
T1 foo(T1 a){
std::cout<< "template foo a :" << a << endl;
return a;
}
};
int main()
{
//4.类模板
//4.1模板对象函数
callback = FunctionClass_template<int>();
callback(41);
//4.2类模板static函数
callback = FunctionClass_template<int>::static_func; //static 函数
callback(42);
//4.3类模板普通函数
FunctionClass_template<int> f_template;
callback = std::bind(&FunctionClass_template<int>::foo,f_template,
std::placeholders::_1);
callback(43);
return 0;
}
5.普通类
#include <iostream>
#include <functional>
using namespace std;
class MyClass
{
public:
int operator()(int a){
std::cout<< "MyClass() a :" << a << endl;
}
static int static_func(int a){
std::cout<< "MyCLass static_func a :" << a << endl;
return a;
}
int foo(int a){
std::cout<< "MyCLass foo a :" << a << endl;
return a;
}
};
int main()
{
//5.普通类
//5.1对象函数
callback = MyClass();
callback(51);
//5.2类内静态函数
callback = MyClass::static_func;
callback(52);
//5.3类内普通函数
MyClass f_myclass;
callback = std::bind(&MyClass::foo,f_myclass,std::placeholders::_1);
callback(53);
return 0;
}
6.lambda表达式
auto f_lambda = [](int a){
std::cout << "lambda a:" << a << std::endl;
return a;
};
callback = f_lambda;
callback(61);
7.std::function的拷贝、移动
std::function<int(int)>callback_2 = callback;
callback_2(71);
std::function<int(int)>callback_3(callback);
callback_3(72);
std::function<int(int)>&& callback_4 = std::move(callback);
callback_4(73);
cpp文件如下:
#include <iostream>
#include <functional>
using namespace std;
std::function<int(int)> callback;
//1.普通的函数
int func(int a){
std::cout<< "func_ a :" << a << endl;
return a;
}
//2.类模板函数
template<class T>
T func_template(T a)
{
std::cout<< "func_template a :" << a << endl;
return a;
}
//3.函数对象
class FucntionClass
{
public:
int operator()(int a){
std::cout<< "FucntionClass a :" << a << endl;
return a;
}
};
//4.模板对象函数
template<class T1>
class FunctionClass_template
{
public:
T1 operator()(T1 a){
std::cout<< "template() a :" << a << endl;
return a;
}
static T1 static_func(T1 a){
std::cout<< "template func a :" << a << endl;
return a;
}
T1 foo(T1 a){
std::cout<< "template foo a :" << a << endl;
return a;
}
};
class MyClass
{
public:
int operator()(int a){
std::cout<< "MyClass() a :" << a << endl;
}
static int static_func(int a){
std::cout<< "MyCLass static_func a :" << a << endl;
return a;
}
int foo(int a){
std::cout<< "MyCLass foo a :" << a << endl;
return a;
}
};
template <typename T>
class foo4{
public:
T foo(T a){
return a * 6;
}
};
int main()
{
//一般出现问题都是callback的参数or返回值类型和自定义的不匹配所致
//1.包装普通的函数
callback = func;
callback(10);
//2.包装模板函数
callback = func_template<double>;
callback(20.0); //结果为2,这里callback是int类型的,所以都会转成int
//3.包装函数对象
callback = FucntionClass();
callback(30);
//4.类模板
//4.1模板对象函数
callback = FunctionClass_template<int>();
callback(41);
//4.2类模板static函数
callback = FunctionClass_template<int>::static_func; //static 函数
callback(42);
//4.3类模板普通函数
FunctionClass_template<int> f_template;
callback = std::bind(&FunctionClass_template<int>::foo,f_template, std::placeholders::_1);
callback(43);
//5.普通类
//5.1对象函数
callback = MyClass();
callback(51);
//5.2类内静态函数
callback = MyClass::static_func;
callback(52);
//5.3类内普通函数
MyClass f_myclass;
callback = std::bind(&MyClass::foo,f_myclass,std::placeholders::_1);
callback(53);
//6.lambda表达式
auto f_lambda = [](int a){
std::cout << "lambda a:" << a << std::endl;
return a;
};
callback = f_lambda;
callback(61);
//7.std::function的拷贝、移动
std::cout << " ------------ " << std::endl;
std::function<int(int)>callback_2 = callback;
callback_2(71);
std::function<int(int)>callback_3(callback);
callback_3(72);
std::function<int(int)>&& callback_4 = std::move(callback);
callback_4(73);
return 0;
}
2.std::bind
bind相当于一个适配器模板类
上图中的callfunc1是我们已经实现的函数,newCall是通过std::bind重新包装的函数。
bind的函数原型:
auto newfunc = bind(func, arg_list);
该形式表达的意思是:当调用newfunc时,会调用func,并传给它arg_list中的参数。
实战中
auto newCall = std::bind(callfunc1,std::placeholders::_1,20);
newCall可以只接收一个参数,调用newCall后会调用callfunc1,比如现在执行了
newCall(99);
这时回调给callfunc1的就是 callfunc1(99,20);
2.类内函数,要将this传参哦
class A {
public:
void fun(int k,int m) {
cout << " k="<< k << ", m = " << m <<endl;
}
};
A a;
auto newClassCall = std::bind(&A::fun,&a,std::placeholders::_1,11);
newClassCall(15);