std::function 是一个 函数包装模板 ,用来存储、转移、调用目标函数,包括普通函数、类的成员函数、lambda表达式、仿函数等。如果std::function未包裹任何可调用的元素,则会抛出std::bad_function_call 异常。
下面是一个关于std::function的使用的一个简单的示例
首先我们定义几个函数:
// 普通函数
void printFunc(int number)
{
std::cout << __FUNCTION__ << " " << number << std::endl;
}
class Foo
{
public:
// 非静态成员函数
void addFunc(int number) {
std::cout << __FUNCTION__ << " " << number + m_Number << std::endl;
}
// 静态成员函数
static void staticFunc(int number) {
std::cout << __FUNCTION__ << " " << number << std::endl;
}
int m_Number = 10;
};
// 仿函数
class ObjectFunc
{
public:
void operator() (int number){
std::cout << __FUNCTION__ << " " << number << std::endl;
}
};
下面是关于函数的调用:
// 普通函数
std::function<void(int)> f1 = printFunc;
f1(10);
// lambda表达式
std::function<void(int)> f2 = [](int n) {
std::cout << __FUNCTION__ << " " << n << std::endl;
};
f2(10);
Foo foo;
// 类的非静态成员函数(对象调用)
std::function<void(int)> f3_1 = std::bind(&Foo::addFunc, foo, std::placeholders::_1);
std::function<void()> f3_2 = std::bind(&Foo::addFunc, foo, 20);
f3_1(10);
f3_2();
// 类的非静态成员函数(指针调用)
std::function<void(int)> f4_1 = std::bind(&Foo::addFunc, foo, std::placeholders::_1);
std::function<void()> f4_2 = std::bind(&Foo::addFunc, foo, 20);
f4_1(10);
f4_2();
// 带固定参数
std::function<void()> f5 = std::bind(printFunc, 100);
f5();
// 类的静态函数
std::function<void(int)> f6 = &Foo::staticFunc;
f6(100);
// 仿函数
std::function<void(int)> f7 = ObjectFunc();
f7(100);
运行结果如下:
printFunc 10
main::<lambda_d2573905243ae936524d018319db3380>::operator () 10
Foo::addFunc 20
Foo::addFunc 30
Foo::addFunc 20
Foo::addFunc 30
printFunc 100
Foo::staticFunc 100
ObjectFunc::operator () 100
作者:douzhq
个人主页:https://www.douzhq.cn
文章同步页:https://douzhq.cn/c11_stdfunction/