std::function 是C++11新增的特性,第一次在代码中遇见它有一种我好像知道它的干嘛的,但是我不确定各种用法对不对。所以还是要对这个新特性进行系统性的学习和总结。本文主要参考了C++Primer(第5版)
一,可调用对象与function
不同类型可能具有相同的调用形式
C++中可调用的对象有函数,函数指针,lambda表达式,bind创建的对象以及重载了函数调用运算符的类。这些不同类型的对象却可以共享同一种调用形式,例如
//普通函数
int add (int i,int j){return i+j;}
//lambda表达式
auto mod=[ ](int i,int j){return i*j;};
尽管这两种可调用对象的类型不同,对参数进行的操作也不同,但是却共享同一种调用方式,即
int(int,int)
二,标准库function类型
function是一个模板,在创建一个具体的function类型的时候我们必须表示对象的调用形式,如:
function<int(int,int)>
这表示我们声明了一个function类型,它可以表示接受两个int并返回一个int的可调用对象
function<int(int,int)> f1=add;
function<int(int,int)> f2=[ ](int i,int j){return i+j;};
三,重载和函数与function
我们不能直接将重载函数的名字传入function类型的对象中
int add(int i,int j){return i+j;};
int add(double i,double j){return i*j};
function<int(int,int)> f3=add;//报错
取而代之的是,我们可以使用函数指针
int(*fp)(int,int)=add;
function<int(int,int)>f4 =fp;
四,例子
当然,如果只是工作中遇到一个简单的例程我也不会对它印象深刻。实际上,我读到的这段代码包含了function类,函数回调,lambda表达式三位一体的代码
using TemplateCallBack=std::function<void(char* buf,int len)>;
TemplateCallBack t1;
void registerCallBack(TemplateCallBack callback)
{
t1=callback;
}
int main()
{
registerCallBack([ ](char* buf,int len){
cout<<buf<<len<<endl;
});
t1("hello world",1);
t1("HELLO WORLD",2);
}