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

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);    


 


原文链接: http://blog.csdn.net/yincheng01/article/details/7204090

你可能感兴趣的:(Visual Studio 11开发指南(17)C++11更新- Lambda表达式)