La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Développement C++ Bonnes pratiques C++11 avec Visual C++ Loïc Joly - CAST Christophe Pichaud - Sogeti www.castsoftware.com www.fr.sogeti.com.

Présentations similaires


Présentation au sujet: "Développement C++ Bonnes pratiques C++11 avec Visual C++ Loïc Joly - CAST Christophe Pichaud - Sogeti www.castsoftware.com www.fr.sogeti.com."— Transcription de la présentation:

1

2 Développement C++ Bonnes pratiques C++11 avec Visual C++ Loïc Joly - CAST Christophe Pichaud - Sogeti

3 Développement C++ #mstechdays Depuis votre smartphone sur : De nombreux lots à gagner toute les heures !!! Claviers, souris et jeux Microsoft… Merci de nous aider à améliorer les Techdays ! Donnez votre avis !

4 performance compatibility portability

5 Développement C++ #mstechdays PLAN Visual C November 2013 CTP Guide de survie en C++11 Interop WinRT

6 Développement C++ #mstechdays C++11 : –Le contenu du November 2012 CTP (voir Développer en natif avec C f3f9ef3a09 ) 90f3f9ef3a09 –=default, =delete, NSDI, greater<>, make_unique… C11 : Meilleur support –_Bool, déclaration au milieu de bloc, designated initializer… Des retouches dIHM (formatage du code…) Visual C

7 Développement C++ #mstechdays CTP = version beta. Installable sans danger. C++ 11 –Génération des fonctions spéciales de déplacement, & and && for *this –Initialisation thread safe des variables statiques –Inheriting constructors –alignof/alignas, __func__, Extended sizeof –constexpr (partiel : Pas les fonctions membre) –noexcept (partiel : Pas la version conditionelle) C++14 –decltype(auto), auto function return type deduction –generic lambdas (partiel : Liste de capture explicite uniquement) Autre –Resumable functions and await November 2013 CTP

8 Développement C++ #mstechdays GUIDE DE SURVIE EN C++11 Autour de la sémantique de déplacement

9 Développement C++ #mstechdays Copie La destination vaut la valeur quavait la source initialement La source est inchangée On peut continuer à utiliser la source Fournit la strong exception guarantee Plus lent Déplacement La destination vaut la valeur quavait la source initialement On se moque de létat de la source, tant quil est viable On va éviter dutiliser la source par la suite Ne fournit que la basic exception guarantee …mais peut souvent être noexcept Plus rapide Intérêt de déplacer

10 Développement C++ #mstechdays Lvalue (ça possède un nom, on peut en prendre ladresse) et Rvalue (le reste) On peut surcharger une fonction là-dessus – int f(maClasses const &c); // Version pour les Lvalues – int f(maClasses &&c); // Version pour les Rvalues Dans la seconde version, comme on sait quon est les seuls à accéder à lobjet, on a le droit dêtre destructif Comment ça marche ?

11 Développement C++ #mstechdays Constructeur et affectation par déplacement – MaClasse(MaClasse &&c); – MaClasse &operator=(MaClasse &&c); Pas générés automatiquement si un destructeur ou constructeur de copie est défini Empêche la génération automatique dun constructeur de copie Règle des 5 (ou règle des 0 !) Comment rendre nos classes déplaçables

12 Développement C++ #mstechdays Si possible, rendre les opérations de déplacement noexcept, et le déclarer –Utiliser une macro en attendant un meilleur support de VC++ Réfléchir à létat dun objet depuis lequel il y a eu déplacement Préférez la règle des 0 à la règle des 5 –Utiliser des classes RAII pour gérer vos données, comme [shared/unique]_ptr –Éviter new et delete ! Quelques conseils sur les classes déplaçables

13 Développement C++ #mstechdays 1.Un type à sémantique de valeur (string, vector, map, optional…) 2.Des pointeurs à propriété unique (unique_ptr / T* observant (observer_ptr ?) 3.Des pointeurs à propriété partagée (shared_ptr/weak_ptr) Utiliser dans lordre de préférence

14 Développement C++ #mstechdays Notion pédagogique inventée pas Scott Meyers T&& dans un contexte où T est déduit Universal reference Selon la manière dont on instanciera, une universal reference deviendra : –Une Lvalue reference si T est une Lvalue –Une Rvalue reference si T est une Rvalue Idéal pour transmettre des arguments à laide de std::forward On na pas forcément le droit de toucher à la source ! Fonctionne souvent assez mal avec la surcharge (car peut déjà tout prendre en charge) Universal references

15 Développement C++ #mstechdays La fonction va :On utilise :Et pour transmettre: Utiliser la donnée Ex: ofstream::open void f(T const &t); ou void f(T &t); g(t) Dupliquer la donnée Ex: vector::push_back void f(T t);g(std::move(t)) void f(T const &t); void f(T&& t); g(t) g(std::move(t)) Transmettre une donnée dont on ne sait rien Ex: make_shared template void f(T &&t); g(std::forward (t)) Transmettre des arguments

16 Développement C++ #mstechdays Et avec des pointeurs intelligents ? PourUtiliser Une fonction manipulant uniquement lobjet pointé void f(T& t); void f(T *t); // Si lobjet peut ne pas exister void f(observer_ptr t); // au lieu de T* ? Une fonction prenant propriété dun objet géré par shared_ptr void f(shared_ptr t); Une fonction prenant la propriété unique dun objet géré par pointeur void f(unique_ptr t); Le restePlus rare…

17 Développement C++ #mstechdays INTEROP WINRT

18 Développement C++ #mstechdays Conception de composants WinRT C# / VBC++/CX C++ avec WRL

19 Développement C++ #mstechdays Pourquoi faire des composants WinRT en C++ Performance Gestion batterie Protection contre la décompilation Accès à Win32 Code existant

20 Développement C++ #mstechdays Scénarios dapplications C++ hybrides Interface HTML/JS Composants WinRT C++ Interface C#/VB Composants WinRT C++ Interface C++ Composants WinRT C#/VB

21 Développement C++ #mstechdays Windows 8 utilise des composants COM –il existe linterface IUnknown –mais aussi IInspectable Ces composants COM sont nommés WinRT Il existe deux manières de coder –C++/CX qui sont des extensions du compilateur –C++ Standard avec WRL : Windows Runtime Library WRL est inspirée de la librairie ATL Le nouveau modèle de composants WinRT

22 Développement C++ #mstechdays Cest un composant COM Il expose des metadata (.winmd) Il utilise les types Windows spécifiques Link avec RuntimeObject.lib Ne tourne que sous Windows 8.x –*En mode Desktop –En mode Store App Un composant WinRT

23 Développement C++ #mstechdays Les entêtes sont définies dans –C:\Program Files (x86)\Windows Kits\8.1\Include\winrt\wrl async.h client.h def.h event.h ftm.h implements.h internal.h module.h wrappers\corewrappers.h La librairie WRL

24 Développement C++ #mstechdays #include "Library1_h.h" namespace ABI { namespace Library1 { class Logger : public RuntimeClass { InspectableClass(L"Library1.Logger", BaseTrust) public: STDMETHOD(get_Name)(HSTRING* value); STDMETHOD(put_Name)(HSTRING value); STDMETHOD(LogInfo)(HSTRING value); STDMETHOD(GetInt32)(int * pValue); private: std::wstring name; }; ActivatableClass(Logger); } Un composant WRL Simple import "inspectable.idl"; import "Windows.Foundation.idl"; #define COMPONENT_VERSION 1.0 namespace Library1 { interface ILogger; runtimeclass Logger; [uuid(3EC4B4D6-14A6-4D0D-BB96-31DA25224A15), version(COMPONENT_VERSION)] interface ILogger : Iinspectable { [propget] HRESULT Name([out, retval] HSTRING* value); [propput] HRESULT Name([in] HSTRING value); HRESULT LogInfo([in] HSTRING value); HRESULT GetInt32([out] int * pValue); } [version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)] runtimeclass Logger { [default] interface ILogger; }

25 Développement C++ #mstechdays #include "Library1_h.h" class Logger : public RuntimeClass, ILogger> { public: STDMETHOD(LogInfo)(BSTR value); }; Un composant COM WRL import "ocidl.idl"; #define COMPONENT_VERSION 1.0 [uuid(3AAF07AA-A699-4E7C-8F01-BFF237D22B1B), version(COMPONENT_VERSION)] interface ILogger : IUnknown { HRESULT LogInfo([in] BSTR bstrMessage); } [uuid(F15D3912-E8B8-40C8-8CF3-354F0B8B93CC), version(COMPONENT_VERSION)] library WRLCOMLibrary1 { [uuid(75DB8F5A-F13F-4E16-A487-9CD26A874654), version(COMPONENT_VERSION)] coclass Logger { [default] interface ILogger; }

26 Développement C++ #mstechdays Attention WRL ne fournit pas de support pour –IDispatch et les interfaces dual, les connections points –Lenregistrement automatique du module Il faut le faire manuellement avec un.reg Windows Registry Editor Version 5.00 Class" "ThreadingModel"="Apartment" [HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{75DB8F5A-F13F-4E16-A487-9CD26A874654}\Programmable] WRL et COM

27 Développement C++ #mstechdays Exemple de méthode dans la classe Root: Windows.Foundation.IAsyncOperation GetLoggerAsync(); Exemple de client XAML C#: private async void Button_Click(object sender, RoutedEventArgs e) { Library1.Root root = new Root(); Library1.ILogger ilogger = await root.GetLoggerAsync(); ilogger.LogInfo("log me !"); } WRL et les méthodes Async

28 Développement C++ #mstechdays interface IRoot; runtimeclass Root; [uuid(3EC4B4D6-14A6-4D0D-BB96-31DA25224A16), version(COMPONENT_VERSION)] interface IRoot : IInspectable { HRESULT GetLoggerAsync([out][retval] Windows.Foundation.IAsyncOperation ** value); } [version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)] runtimeclass Root { [default] interface IRoot; } Un composant WRL et les méthodes Async

29 Développement C++ #mstechdays #include "Library1_h.h" namespace ABI { namespace Library1 { class Root : public RuntimeClass { InspectableClass(L"Library1.Root", BaseTrust) public: STDMETHOD(GetLoggerAsync)(Windows::Foundation::IAsyncOperation ** value); }; ActivatableClass(Logger); } Il faut maintenant implémenter cette interface C:\Program Files (x86)\Windows Kits\8.1\Include\winrt –windows.foundation.collections.h Le composant WRL avec une méthode Async

30 Développement C++ #mstechdays namespace ABI { namespace Library1 { STDMETHODIMP Root::GetLoggerAsync(Windows::Foundation::IAsyncOperation ** value) { ComPtr > pObject = Make >( std::async([&]() -> ILogger* { ComPtr p = Make (); return p.Detach(); })); *value = pObject.Detach(); return S_OK; } La magie est contenue dans la classe task_based_async_operation via PPL Tasks. La routine GetLoggerAsync()

31 Développement C++ #mstechdays Exemple de méthode dans la classe Root: Windows.Foundation.Collections::IVector Getvector(); Exemple de client XAML C#: private async void Button_Click(object sender, RoutedEventArgs e) { Library1.Root root = new Root(); IList list = root.GetVector(); foreach (string s in list) { … } } WRL et les Collections

32 Développement C++ #mstechdays interface IRoot; runtimeclass Root; [uuid(3EC4B4D6-14A6-4D0D-BB96-31DA25224A16), version(COMPONENT_VERSION)] interface IRoot : IInspectable { HRESULT GetVector([out][retval] Windows.Foundation.Collections.IVector ** value); } [version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)] runtimeclass Root { [default] interface IRoot; } Un composant WRL et les collections

33 Développement C++ #mstechdays #include "Library1_h.h" namespace ABI { namespace Library1 { class Root : public RuntimeClass { InspectableClass(L"Library1.Root", BaseTrust) public: STDMETHOD(GetVector)(Windows::Foundation::Collections::IVector ** value); }; ActivatableClass(Logger); } Il faut maintenant implémenter cette interface C:\Program Files (x86)\Windows Kits\8.1\Include\winrt –windows.foundation.collections.h Le composant WRL avec les collections

34 Développement C++ #mstechdays namespace ABI { namespace Library1 { STDMETHODIMP Root::GetVector(Windows::Foundation::Collections::IVector ** value) { ComPtr > v = Make >(); HString str; str.Set(L"String1"); v->Append(str.Detach()); str.Set(L"String2"); v->Append(str.Detach()); str.Set(L"String3"); v->Append(str.Detach()); *value = v.Detach(); return S_OK; } La magie est contenue dans la classe Vector via std::vector. La routine GetVector()

35 Développement C++ #mstechdays Support en C++/CX via les PPL Taks IAsyncOperation ^ CalculateAnswer() { return concurrency::create_async([]() -> int { // faire une opération longue ici… return 42; }); } IAsyncOperation ^ CalculateQuestion() { return create_async([]() -> String^ { // faire une opération longue ici… return ref new String(LHello IAsyncOperation …"); }); } WRL et les opérations asynchrones

36 Développement C++ #mstechdays CONCLUSION

37 Développement C++ #mstechdays Juin 2013

38 Développement C++ #mstechdays C/C++ French user group :

39 démo Développement C++ #mstechdays

40 Développement C++ #mstechdays GROSSE PARTIE Sous titre

41 Développement C++ #mstechdays Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. –It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. –It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Titre et contenu

42 Développement C++ #mstechdays Titre seul

43 Développement C++ #mstechdays Exemple de graphs

44 Développement C++ #mstechdays Colonne 1 Colonne 2 Titre et 2 colonnes

45 Développement C++ #mstechdays Elément 1 Paramètre 1 Paramètre 2 Elément 2 Paramètre 1 Paramètre 2 Titre comparaison

46 Développement C++ #mstechdays Slide avec code Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

47 démo Développement C++ #mstechdays NOM DÉMO Sous titre démo

48 Vidéo Développement C++ #mstechdays TITRE VIDÉO Sous titre

49 Digital is business


Télécharger ppt "Développement C++ Bonnes pratiques C++11 avec Visual C++ Loïc Joly - CAST Christophe Pichaud - Sogeti www.castsoftware.com www.fr.sogeti.com."

Présentations similaires


Annonces Google