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)->BOOL2. {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);
趕緊下載VS11體驗吧
http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144