Visual Studio 2010 年以来有可能在 c + + 代码中,和更具体地 STL 使用 Lambda 表达式 (匿名方法的窗体)。例如,他们是很好的做法,当我们使用这些类型的算法for_each、 parallel_for、 parallel_for_each等。
1.std::deque<int> d1;
2. d1.push_back (2);
3. d1.push_back (1);
4. d1.push_back(3);
5. d1.push_back(0);
6. auto a=d1.begin ();
7. auto b=d1.end ();
8. std::sort(a,b);
9.
10. std::for_each (a,b,[](int i)
11. {
12. std::cout << i << std::endl;
13. });
Lambda 这里开始用两个字符[]以指示我们捕获语法相对于没有本地变量[] 或 [=]或我们捕获所有的本地变量由引用或副本分别。做不捕获任何变量是 lambda 说是无国籍(也就是要说没有国家)。
现在,这种类型的 lambda 隐式转换为函数指针,换句话说,我们要用我们良好的旧 Win32 API。
此处的示例与CreateThreadpoolWorkAPI,指向函数的指针参数 1,键入PTP_WORK_CALLBACK ,或我们考虑他放置的 lambda 虽然明显好参数。
1.PTP_POOL pool=CreateThreadpool(NULL);
2. TP_CALLBACK_ENVIRON cbEnviron;
3. InitializeThreadpoolEnvironment(&cbEnviron);
4. SetThreadpoolThreadMaximum (pool,4);
5. BOOL bRet=SetThreadpoolThreadMinimum (pool,2);
6.
7.
8. PTP_WORK work=CreateThreadpoolWork([]( PTP_CALLBACK_INSTANCE Instance,PVOID Context,PTP_WORK Work)
9. {
10.
11. wprintf(L"Fait du boulot\n");
12. },NULL,&cbEnviron);
13. SubmitThreadpoolWork(work);
14. WaitForThreadpoolWorkCallbacks(work,FALSE);
15. CloseThreadpoolWork(work);
16. CloseThreadpool(pool);
另一个示例 API EnumWindows,或我们可以对"现代 c + +"混合使用旧 API 调用
1.BOOL ret=EnumWindows ([](HWND hwnd,LPARAM lParam)->BOOL
2. {
3. const size_t MAX_SIZE=2048;
4. LPWSTR title=static_cast<LPWSTR>(_malloca(MAX_SIZE));
5. if (title!=nullptr)
6. {
7. ZeroMemory (title,MAX_SIZE);
8. if (GetWindowTextLength (hwnd) >0)
9. {
10. GetWindowTextW (hwnd,title,MAX_SIZE);
11. wprintf(L"%ls\n",title);
12. _freea(title);
13. }
14. }
15.
16. return TRUE;
17. },0);