在C++11中引入了std::function, 那么function有什么好处呢。
简而言之, std::function是
对C++中各种可调用实体的封装,形成一个新的可调用的std::function对象。可调用实体是什么呢?C++中都有哪些可调用实体呢?
在C++中,可调用实体包括如下四类:
1、是一个函数指针。(函数必须和C函数一样可在编译期之内唯一确定的函数指针)
2、函数对象(也叫仿函数),即具有一个重载operator()成员函数的类对象。
3、是一个可被转换为函数指针的类对象。(这一点与2是一样的,函数可以使用函数名+operator的形式调用,也可以使用函数指针如 void(*p)(int); p = test;(*p) (n); 注意看下面例子中的这一种情况)
4、是一个类成员(函数)指针。
请看下面的例子:
#include <functional> // std::function 位于<functional>头文件中
#include <iostream>
using namespace std;
std::function< int(int)> MyFunction; //接受一个int形参,返回int
// 普通函数
int TestFunction(int arg)
{
return arg;
}
// Lambda表达式
auto myLambda = [](int arg)->int{ return arg; };
// 仿函数(functor)
class MyFunctor
{
public:
int operator()(int arg)
{
return arg;
}
};
// 类的普通成员函数以及静态成员函数
class MyTestingClass
{
public:
int ClassFunctionMember(int arg) { return arg; } // 类成员函数
static int StaticFunctionMember(int arg) { return arg; } // 类静态函数
};
int main()
{
// 普通函数
MyFunction = TestFunction;
int ret= MyFunction (20);
cout << "普通函数:"<< ret << endl;
// Lambda表达式
MyFunction = myLambda;
ret= MyFunction(30);
cout << "Lambda表达式:"<< ret << endl;
// 仿函数
MyFunctor testFunctor;
MyFunction = testFunctor;
ret = MyFunction(40);
cout << "仿函数:"<< ret << endl;
// 类成员函数
MyTestingClass myTestingObj;
MyFunction = std::bind(&MyTestingClass::ClassFunctionMember, myTestingObj, std::placeholders::_1);
ret= MyFunction(40);
cout << "类成员函数:"<< ret << endl;
// 类静态函数
MyFunction = TestClass::StaticMember;
ret = MyFunction(50);
cout << "类静态函数:"<< ret << endl;
return 0;
}