Visual Studio 11开发指南(17)C++11更新- Lambda表达式

最后更新于:2022-04-01 10:27:27

Visual Studio 2010 年以来有可能在 c + + 代码中,和更具体地 STL 使用 Lambda 表达式 (匿名方法的窗体)。例如,看下面的代码执行,当使用这些类型的算法for_each、 parallel_for、 parallel_for_each等等的时候。 ~~~ std::deque<int> d1; d1.push_back (2); d1.push_back (1); d1.push_back(3); d1.push_back(0); auto a=d1.begin (); auto b=d1.end (); std::sort(a,b); std::for_each (a,b,[](int i) { std::cout << i << std::endl; }); ~~~ Lambda 这里开始用两个字符[]以指示我们捕获语法相对于没有本地变量[] 或 [=]或我们捕获所有的本地变量由引用或备份分别。做不捕获任何变量是 lambda 说是无限定的。 现在,这种类型的 lambda 隐式转换为函数指针,换句话说,成功调用旧的 Win32 API。 此处的示例与CreateThreadpoolWorkAPI,指向函数的指针参数 1,键入PTP_WORK_CALLBACK ,比原来的 lambda明显更好一些。 ~~~ PTP_POOL pool=CreateThreadpool(NULL); TP_CALLBACK_ENVIRON cbEnviron; InitializeThreadpoolEnvironment(&cbEnviron); SetThreadpoolThreadMaximum (pool,4); BOOL bRet=SetThreadpoolThreadMinimum (pool,2); PTP_WORK work=CreateThreadpoolWork([]( PTP_CALLBACK_INSTANCE Instance,PVOID Context,PTP_WORK Work) { wprintf(L"Fait du boulot\n"); },NULL,&cbEnviron); SubmitThreadpoolWork(work); WaitForThreadpoolWorkCallbacks(work,FALSE); CloseThreadpoolWork(work); CloseThreadpool(pool); ~~~ 另一个示例 API EnumWindows,或我们可以对"现代 c + +代码"混合使用旧 API 调用 ~~~ BOOL ret=EnumWindows ([](HWND hwnd,LPARAM lParam)->BOOL { const size_t MAX_SIZE=2048; LPWSTR title=static_cast<LPWSTR>(_malloca(MAX_SIZE)); if (title!=nullptr) { ZeroMemory (title,MAX_SIZE); if (GetWindowTextLength (hwnd) >0) { GetWindowTextW (hwnd,title,MAX_SIZE); wprintf(L"%ls\n",title); _freea(title); } } return TRUE; },0); ~~~ 赶紧下载VS11体验吧 [http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144](http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144)
';