std::function
, 头文件functional
,是一个类模板Class template, c++11引入
template< class R, class... Args > class function<R(Args...)>;
std::function
也被称为通用的多态函数包装器(也可以包装类成员变量),可以保存、复制和调用那些可以被调用的对象,例如函数,lambda表达式,bind表达式,类成员函数,类成员等。 调用一个空的函数包装器会抛出 std::bad_function_call
异常。
- 包装普通函数
#include<iostream>
#include<functional>
using namespace std;
int print(int a)
{
cout << a << endl;
return 0;
}
int main()
{
function<int(int)> func(print);
func(3); // 3
getchar();
return 0;
}
- 包装一个lambda表达式
int main()
{
function<int(int)> func([](int a) { cout << a << endl; return 0; }); // 2
func(2);
getchar();
return 0;
}
- 包装一个bind表达式
std::bind
函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
std::bind
将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function
保存
bind
绑定类成员函数时,第一个参数表示对象的成员函数的指针,第二个参数表示对象的地址。
#include<iostream>
#include<functional>
using namespace std;
int print2(int a)
{
cout << a << endl;
return 0;
}
class classA {
public:
void testPrint(int a)
{
cout << "classA::testPrint" << a << endl;
}
};
int main()
{
function<int(int)> func = bind(print2, placeholders::_1);
func(43); // 43
classA cla;
function<void(int)> func2 = bind(&classA::testPrint, cla, placeholders::_1); // 前面声明时不需要携带类声明
func2(22); // classA::testPrint22
getchar();
return 0;
}
- 包装一个类成员函数/类成员变量
声明的时候注意类对象: function<void(classA&, int)> func = &classA::testPrint;
#include<iostream>
#include<functional>
using namespace std;
class classA {
public:
void testPrint(int a)
{
cout << "classA::testPrint" << a << endl;
}
int num;
};
int main()
{
classA cla;
cla.num = 3;
function<void(classA&, int)> func = &classA::testPrint;
func(cla, 22); // classA::testPrint22
function<int(classA&)> func2 = &classA::num;
cout << func2(cla) << endl; // 3
getchar();
return 0;
}
- 调用一个空包装器,抛出异常
int main()
{
function<int(int)> func;
try
{
func(3);
}
catch (const std::exception&e)
{
cout << e.what() << endl; // bad function call
}
getchar();
return 0;
}
参考:
https://blog.csdn.net/qq_35721743/article/details/83217416
https://www.cnblogs.com/bencai/p/9124654.html
https://www.cnblogs.com/reboost/p/11076511.html
https://www.jianshu.com/p/f191e88dcc80
https://en.cppreference.com/w/cpp/utility/functional/function