* Functor中文翻译为仿函数。
* lambda与匿名函数密不可分。lambda本身隐式地定义了对应的函数对象类型(Functor Class)以及该类的对象(Functor object)。
Functor
特性
* 可包含状态。
* 可用作模板参数。
* 与函数指针相比,Functor语法复杂(需要定义一个类型),但可保存状态。lambda既可以保存状态,语法又够简洁。
demo
class FunctorAdd_X { int _state; // 状态 public: FunctorAdd_X(int _s):_state(_s){} // 初始化状态 int operator()(int y) const { return y+_state; } }; void TestFunctor() { FunctorAdd_X myAdd(10); int z = myAdd(1); cout << z << endl; }
Lambda
1 lambda引入标志。[]中的=表示以值的方式捕获外部变量(只读),&表示以引用的方式捕获(可修改):
* []没有符号,表示不捕获。
* [&a] 以引用的方式捕获a。
* [=,&a] 默认以值捕获,但a以引用的方式捕获。
2 参数列表
3 mutable
4 异常标识
5 返回值
6 函数体
demo
void TestLambda() { // 无返回值、无参数 [](){cout << "I am in lambda." << endl;}(); // 有参数,常量传递参数 [](int x){cout << "x="<< x << endl;}(1); // 引用的方式传递参数 int a=1; [](int& x){ cout << "change x to " << ++x << endl;}(a); cout << "after change,a=" << a << endl; // 值捕获,捕获的变量只读 int b=1; [=](){cout << " b =" << b << endl;}(); // 引用捕获 int c=1; [&](){cout << " change c to " << ++c << endl;}(); cout << c << endl; // 值捕获混合引用捕获 int m=1; int n=2; [=,&n](){++n;/*++m*/;}(); cout << "m,n="<<m<<","<<n<<endl; // 有返回值 int d = []()->int{return 1;}(); cout << "d = " << d << endl; // 有返回值,但不标出 int e = [](){return 1;}(); cout << "e = " << e << endl; // 定义一个类似匿名函数 auto GetMax = [](int x,int y){ return x>y?x:y;}; int f = GetMax(1,2); cout << "f = " << f << endl; }
References
http://msdn.microsoft.com/zh-cn/library/vstudio/aa985932.aspx 函数对象
http://msdn.microsoft.com/zh-cn/library/vstudio/dd293608.aspx Lambda
http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11 Lambda expression
[C++] Functor与lambda
时间: 2024-10-13 15:17:02