Nouveauté C++ de la preview de Visual Studio 11 Partie II

Téléchargement de la CTP de Visual Studio 11

Retrouvez la Partie 1

Retrouvez la Partie 3

Retrouvez la Partie 4

Depuis Visual Studio 2010, il est possible d’utiliser les expressions Lambda (forme de méthode anonyme) dans du code C++, et plus précisément avec la STL. Elles sont bien pratique par exemple, lorsque nous les utilisons avec des algorithmes de type for_each, parallel_for, parallel_for_each, etc..

Code Snippet

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

Ici la lambda commence par les deux caractères [] qui indiquent que nous ne capturons aucune variable locale par opposition à la syntaxe [&] ou [=] ou nous capturons toutes les variables locales par référence ou par copie respectivement. Le faite de ne capturer aucune variable fait que la lambda est dite stateless (c’est à dire sans état).

Désormais, ce type de lambda est convertie implicitement en pointeur de fonction, en d’autres termes, on va pouvoir les utiliser avec nos bonnes vieilles API Win32.
Un exemple ici avec l’API CreateThreadpoolWork, qui prend comme 1er paramètre un pointeur de fonction de type PTP_WORK_CALLBACK ou nous lui passons à la place une lambda avec bien évidement les bons paramètres.

Code Snippet

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

Un autre exemple sur l’API EnumWindows, ou nous pouvons mixer du “C++ Moderne” avec des appels d’API à l’ancienne !!

Code Snippet

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

 

Eric Vernié