C++11重要特性:lambda+function
2016-10-19 10:43
423 查看
1. lambda
lambda-introducer (捕获字段)
lambda-parameter-declaration-list (变量列表)
mutable-specification (捕获的变量可否修改)
exception-specification (异常设定)
lambda-return-type-clause (返回类型)
compound-statement (函数体)
捕获字段:空,=,&
空:不能访问外部变量
=:按值访问外部变量,[var]按值访问var,[=]按值访问所有变量
&:引用方式访问外部变量,[&var]引用访问var变量,[&]引用访问所有变量
组合[=,&var]能够按照引用访问var和按值访问所有变量
特殊情况:lambda函数在某个成员函数里面时,[this]和[=]可以访问这个成员函数所能访问的对象
理解捕获的概念:
直接调用生成运算结果:
lambda的嵌套:
更高级嵌套的:
addtwointegers(7)生成了一个function<int(int)>函数,函数功能是计算7+输入的累加和
higherorder 可以看做是一个更高级的lambda,调用生成的addtwointegers(7),给它传入一个参数,计算结果
2. function包装器
function<>包装器可以将普通函数,lambad函数,函数对象统一分装起来,虽然它们不是相同的类型,但是经过了function模板后,它们可以转化为相同的function的对象
当然最好是能够学习function的原理,参考博客:http://blog.163.com/lvan100@yeah/blog/static/6811721420127511289750/
3.
lambda-introducer (捕获字段)
lambda-parameter-declaration-list (变量列表)
mutable-specification (捕获的变量可否修改)
exception-specification (异常设定)
lambda-return-type-clause (返回类型)
compound-statement (函数体)
捕获字段:空,=,&
空:不能访问外部变量
=:按值访问外部变量,[var]按值访问var,[=]按值访问所有变量
&:引用方式访问外部变量,[&var]引用访问var变量,[&]引用访问所有变量
组合[=,&var]能够按照引用访问var和按值访问所有变量
特殊情况:lambda函数在某个成员函数里面时,[this]和[=]可以访问这个成员函数所能访问的对象
理解捕获的概念:
// declaring_lambda_expressions2.cpp // compile with: /EHsc /W4 #include <functional> #include <iostream> int main() { using namespace std; int i = 3; int j = 5; // The following lambda expression captures i by value and // j by reference. function<int (void)> f = [i, &j] { return i + j; };//声明定义f的时候,使用i的值传入,j的引用 // Change the values of i and j. i = 22; j = 44; // Call f and print its result. cout << f() << endl; //output:3+44=47 }
直接调用生成运算结果:
#include <iostream> int main() { using namespace std; int n = [] (int x, int y) { return x + y; }(5, 4); cout << n << endl; }
lambda的嵌套:
#include <iostream> int main() { using namespace std; // The following lambda expression contains a nested lambda // expression. int timestwoplusthree = [](int x) { return [](int y) { return y * 2; }(x) + 3; }(5); // Print the result. cout << timestwoplusthree << endl; }
更高级嵌套的:
#include <iostream> #include <functional> int main() { using namespace std; auto addtwointegers = [](int x) -> function<int(int)> { return [=](int y) { return x + y; }; }; auto higherorder = [](const function<int(int)>& f, int z) { return f(z) * 2; }; auto answer = higherorder(addtwointegers(7), 8); cout << answer << endl; }
addtwointegers(7)生成了一个function<int(int)>函数,函数功能是计算7+输入的累加和
higherorder 可以看做是一个更高级的lambda,调用生成的addtwointegers(7),给它传入一个参数,计算结果
2. function包装器
function<>包装器可以将普通函数,lambad函数,函数对象统一分装起来,虽然它们不是相同的类型,但是经过了function模板后,它们可以转化为相同的function的对象
int add(int i, int j) { return i + j; } //普通函数 // lambda表达式 auto mod = [](int i, int j){return i % j; }; // 函数对象类 struct divide { int operator() (int denominator, int divisor) { return denominator / divisor; } }; int main(int argc, char *argv[]) { map<char, function<int(int, int)>> binops = { { '+', add }, { '-', minus<int>() }, { '*', [](int i, int j){return i * j; } }, { '/', divide() }, { '%', mod }, }; cout << binops['+'](10, 5) << endl; cout << binops['-'](10, 5) << endl; cout << binops['*'](10, 5) << endl; cout << binops['/'](10, 5) << endl; cout << binops['%'](10, 5) << endl; system("pause"); return 0; }
当然最好是能够学习function的原理,参考博客:http://blog.163.com/lvan100@yeah/blog/static/6811721420127511289750/
3.
相关文章推荐
- C++11新特性(六)bind,function,lambda简单使用
- 【C++】C++11特性:lambda和function
- C++11新特性:function, bind和lambda
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析(三)
- c++11新特性--Lambda表达式
- C++11新特性:Lambda函数(匿名函数)
- C++11新特性:Lambda函数(匿名函数)
- C++11新特性:Lambda函数(匿名函数)
- C++11新特性之八——函数对象function
- C++11新特性:Lambda函数(匿名函数)
- C++11新特性:Lambda函数(匿名函数)
- C++11的新特性lambda的小试牛刀RAII
- C++11新特性之九——function、bind以及lamda表达式总结
- c++11新特性(4) lambda捕捉块
- 【很nice的一篇文章】c++11特性与cocos2d-x 3.0之std::bind与std::function
- c++11新特性 lambda
- C++11新特性-lambda函数
- C++11新特性:Lambda函数(匿名函数)
- c++11基础学习(2)std::bind与std::function特性
- C++11新特性:Lambda函数(匿名函数)