介绍: std::function是一个可调用对象包装器,是一个类模板,可以容纳所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。
头文件:#include <functional>
定义格式: std::function<函数类型>
因为std::function是一种模板,所以要传入类型,将其当做std::vector<>这样的模板, 像std::vector<int>传入类型int一样,std::function传入的是函数类型<返回值 (参数类型)>,如:std::function<void (int)>。
作用: std::function可以取代函数指针的作用,因为它可以延迟函数的执行,特别适合作为回调函数使用。它比普通函数指针更加的灵活和便利。
代码示例:
1、普通函数:
void func1(int val1,int val2)
{
cout << "func1:" << val1 + val2 << endl;
}
int main()
{
function<void(int val1,int val2)> funcPtr = nullptr;
funcPtr = func1;
funcPtr(1,2);
getchar();
return 0;
}
2、模板函数:
T g_Add(T i, T j)
{
cout << i + j;
return i + j;
}
std::function<int(int,int)> f = nullptr;
f = g_Add<int>;
f(1,3);
3、匿名函数:
auto func = [](int i, int j) -> int { // auto其实也是一个function指针
cout << i + j;
return i + j;
};
std::function<int(int,int)> f = func;
f(1,2);
4、其他函数用法参考:c++ 知识点 std::function 使用
5、常见用法:
A类想调用B类的成员函数,不想让A类成为B类的友元(破坏封装),方法有:
1、直接返回B类成员函数的指针,赋值给function指针(需要将类对象地址 &c 绑定上),操作繁琐;
2、将B类成员函数包装进lambda表达式(匿名函数),匿名函数指针赋值给A类成员变量(function指针变量),调用A类成员变量完成B类函数调用 (回调函数,延迟函数执行)。
- 做回调函数时,必须拥有调用类的指针或者引用,若临时创建一个局部的实例,赋值给其函数指针变量离开作用域就没用了。但用作透传的类实例可以是局部的。回调函数一般在init函数中设置。
3、两个领域(每个领域中都有多个类)间的类相互调用,通过做一个代理类agent_class,需要相互调用的类都保存该代理类的指针(可利用成员变量在调用类的init函数中赋值),在该类中做回调函数,用于交互。
参考资料:
1、C++11 中的std::function和std::bind 极好
2、std::function::function
3、c++ 知识点 std::function 使用