SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Bonnes pratiques C++11
avec Visual C++
Loïc Joly - CAST
Christophe Pichaud - Sogeti
www.castsoftware.com
www.fr.sogeti.com

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

#mstechdays

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

#mstechdays

Développement C++
Visual C++ 2013
• C++11 :
– Le contenu du November 2012 CTP (voir Développer
en natif avec C++11 http://microsoft.com/showcase/fr/fr/details/b67dd5c8-9a6e-4bb9-a1d290f3f9ef3a09)
– =default, =delete, NSDI, greater<>, make_unique…

• C11 : Meilleur support
– _Bool, déclaration au milieu de bloc, designated
initializer…

• Des retouches d’IHM (formatage du

#mstechdays

Développement C++
November 2013 CTP
• 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
#mstechdays

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

#mstechdays

Développement C++
Intérêt de déplacer
Copie

Déplacement

• La destination vaut la valeur
qu’avait la source initialement
• La source est inchangée
• On peut continuer à utiliser la
source
• Fournit la strong exception
guarantee
• Plus lent

•
•
•
•
•
•

#mstechdays

La destination vaut la valeur
qu’avait la source initialement
On se moque de l’état de la
source, tant qu’il est viable
On va éviter d’utiliser la source
par la suite
Ne fournit que la basic exception
guarantee
…mais peut souvent être
noexcept
Plus rapide

Développement C++
Comment ça marche ?
• Lvalue (ça possède un nom, on peut en prendre
l’adresse) 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 qu’on est les
seuls à accéder à l’objet, on a le droit d’être destructif

#mstechdays

Développement C++
Comment rendre nos classes déplaçables
• 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 d’un constructeur de copie
• Règle des 5 (ou règle des 0 !)

#mstechdays

Développement C++
Quelques conseils sur les classes
déplaçables

• 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 d’un 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 !

#mstechdays

Développement C++
Utiliser dans l’ordre de préférence
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)

#mstechdays

Développement C++
Universal references
• 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 à l’aide de std::forward
• On n’a pas forcément le droit de toucher à la source !
• Fonctionne souvent assez mal avec la surcharge (car peut déjà tout
prendre en charge)
#mstechdays

Développement C++
Transmettre des arguments
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 <class T>
void f(T &&t);

g(std::forward<T>(t))

#mstechdays

Développement C++
Et avec des pointeurs intelligents ?
Pour

Utiliser

Une fonction manipulant uniquement
l’objet pointé

void f(T& t);
void f(T *t); // Si l’objet peut ne pas
exister
void f(observer_ptr<T> t); // au lieu de
T* ?

Une fonction prenant propriété d’un
objet géré par shared_ptr

void f(shared_ptr<T> t);

Une fonction prenant la propriété
unique d’un objet géré par pointeur

void f(unique_ptr<T> t);

Le reste

Plus rare…

#mstechdays

Développement C++
INTEROP WINRT

#mstechdays

Développement C++
Conception de composants WinRT

C# / VB

#mstechdays

C++/CX

Développement C++

C++ avec
WRL
Pourquoi faire des composants WinRT en C++
Gestion
batterie

Performance

Accès à
Win32

#mstechdays

Protection
contre la
décompilation

Code
existant

Développement C++
Scénarios d’applications C++ hybrides
Interface
HTML/JS

Interface
C#/VB

Interface
C++

Composants
WinRT C++

Composants
WinRT C++

Composants
WinRT C#/VB

#mstechdays

Développement C++
Le nouveau modèle de composants WinRT
• Windows 8 utilise des composants COM
– il existe l’interface 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

#mstechdays

Développement C++
Un composant WinRT
•
•
•
•
•

C’est 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

#mstechdays

Développement C++
La librairie WRL
• Les entêtes sont définies dans
– C:Program Files (x86)Windows Kits8.1Includewinrtwrl
• async.h
• client.h
• def.h
• event.h
• ftm.h
• implements.h
• internal.h
• module.h
• wrapperscorewrappers.h
#mstechdays

Développement C++
Un composant WRL Simple

import "inspectable.idl";
import "Windows.Foundation.idl";
#define COMPONENT_VERSION 1.0
namespace Library1 {

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

#mstechdays

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

Développement C++
WRL et COM
• Attention WRL ne fournit pas de support pour
– IDispatch et les interfaces dual, les connections points
– L’enregistrement automatique du module
• Il faut le faire manuellement avec un .reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}]
@="Logger Class"
[HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}InprocServer32]
@="C:devStoreApp1DebugWRLCOMLibrary1Dll.dll"
"ThreadingModel"="Apartment"
[HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}Programmable]
[HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}TypeLib]
@="{F15D3912-E8B8-40C8-8CF3-354F0B8B93CC}"
[HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}Version]
@="1.0“

#mstechdays

Développement C++
WRL et les méthodes Async
• Exemple de méthode dans la classe Root:
Windows.Foundation.IAsyncOperation<ILogger> 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 !");
}
#mstechdays

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

Développement C++
Le composant WRL avec une méthode Async
#include "Library1_h.h"
namespace ABI { namespace Library1 {
class Root : public RuntimeClass<IRoot>
{
InspectableClass(L"Library1.Root", BaseTrust)
public:
STDMETHOD(GetLoggerAsync)(Windows::Foundation::IAsyncOperation<ILogger*>** value);
};
ActivatableClass(Logger);
}
}

•
•

Il faut maintenant implémenter cette interface
C:Program Files (x86)Windows Kits8.1Includewinrt
– windows.foundation.collections.h

#mstechdays

Développement C++
La routine GetLoggerAsync()
namespace ABI { namespace Library1 {
STDMETHODIMP Root::GetLoggerAsync(Windows::Foundation::IAsyncOperation<ILogger*>** value)
{
ComPtr<task_based_async_operation<ILogger>> pObject =
Make<task_based_async_operation<ILogger>>(
std::async([&]() -> ILogger*
{
ComPtr<Logger> p = Make<Logger>();
return p.Detach();
}));
*value = pObject.Detach();
return S_OK;
}

•

La magie est contenue dans la classe task_based_async_operation via
PPL Tasks.

#mstechdays

Développement C++
WRL et les Collections
• Exemple de méthode dans la classe Root:
Windows.Foundation.Collections::IVector<HSTRING> Getvector();

• Exemple de client XAML C#:
private async void Button_Click(object sender, RoutedEventArgs e)
{
Library1.Root root = new Root();
IList<string> list = root.GetVector();
foreach (string s in list) { … }
}
#mstechdays

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

Développement C++
Le composant WRL avec les collections
#include "Library1_h.h"
namespace ABI { namespace Library1 {
class Root : public RuntimeClass<IRoot>
{
InspectableClass(L"Library1.Root", BaseTrust)
public:
STDMETHOD(GetVector)(Windows::Foundation::Collections::IVector<HSTRING>** value);
};
ActivatableClass(Logger);
}
}

•
•

Il faut maintenant implémenter cette interface
C:Program Files (x86)Windows Kits8.1Includewinrt
– windows.foundation.collections.h

#mstechdays

Développement C++
La routine GetVector()
namespace ABI { namespace Library1 {
STDMETHODIMP Root::GetVector(Windows::Foundation::Collections::IVector<HSTRING>** value)
{
ComPtr<Vector<HSTRING>> v = Make<Vector<HSTRING>>();
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<T>.

#mstechdays

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

Développement C++
CONCLUSION

#mstechdays

Développement C++
Juin 2013

#mstechdays

Développement C++
C/C++ French user group : cpp-frug@googlegroups.com
#mstechdays

Développement C++
#mstechdays

Développement C++
GROSSE PARTIE
Sous titre

#mstechdays

Développement C++
Titre et contenu
• 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.
#mstechdays
Développement C++
Titre seul

#mstechdays

Développement C++
Exemple de graphs
Sales

1st Qtr

#mstechdays

2nd Qtr

Développement C++

3rd Qtr

4th Qtr
Titre et 2 colonnes
• Colonne 1

#mstechdays

• Colonne 2

Développement C++
Titre comparaison
Elément 1

Elément 2

• Paramètre 1
• Paramètre 2

• Paramètre 1
• Paramètre 2

#mstechdays

Développement C++
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.

#mstechdays

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

#mstechdays

Développement C++
TITRE VIDÉO
Sous titre

#mstechdays

Développement C++
Digital is
business

Weitere ähnliche Inhalte

Was ist angesagt?

Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoftdavrous
 
C1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieC1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieLoic Yon
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEBAbbes Rharrab
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp FrGregory Renard
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
Découverte d'UNIX - ISIMA
Découverte d'UNIX - ISIMADécouverte d'UNIX - ISIMA
Découverte d'UNIX - ISIMALoic Yon
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Présentation JavaScript
Présentation JavaScriptPrésentation JavaScript
Présentation JavaScripttarkan_
 
Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewOSInet
 
Cours VB 2012 seance 1
Cours VB 2012 seance 1Cours VB 2012 seance 1
Cours VB 2012 seance 1ISIG
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Introduction TypeScript
Introduction TypeScriptIntroduction TypeScript
Introduction TypeScriptfelixbillon
 
Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Laurent BUNIET
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simplesPethrvs
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Aurélien Regat-Barrel
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 
Solutions Linux 2008 - JavaScript
Solutions Linux 2008 - JavaScriptSolutions Linux 2008 - JavaScript
Solutions Linux 2008 - JavaScriptRaphaël Semeteys
 

Was ist angesagt? (20)

Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
C1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieC1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partie
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEB
 
openFrameworks
openFrameworksopenFrameworks
openFrameworks
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp Fr
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
Découverte d'UNIX - ISIMA
Découverte d'UNIX - ISIMADécouverte d'UNIX - ISIMA
Découverte d'UNIX - ISIMA
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Présentation JavaScript
Présentation JavaScriptPrésentation JavaScript
Présentation JavaScript
 
Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TView
 
Cours VB 2012 seance 1
Cours VB 2012 seance 1Cours VB 2012 seance 1
Cours VB 2012 seance 1
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Javascript proprement
Javascript proprementJavascript proprement
Javascript proprement
 
Introduction TypeScript
Introduction TypeScriptIntroduction TypeScript
Introduction TypeScript
 
JAVA 8
JAVA 8JAVA 8
JAVA 8
 
Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
Solutions Linux 2008 - JavaScript
Solutions Linux 2008 - JavaScriptSolutions Linux 2008 - JavaScript
Solutions Linux 2008 - JavaScript
 

Andere mochten auch

Curso E-marketing pude 2008
Curso E-marketing pude 2008Curso E-marketing pude 2008
Curso E-marketing pude 2008Eduardo López
 
Comunicacion
ComunicacionComunicacion
Comunicacionirojas
 
Presentacion Weblog
Presentacion WeblogPresentacion Weblog
Presentacion Weblogdanny31
 
Presentacion M4
Presentacion M4Presentacion M4
Presentacion M4elorri
 
Utilisabilité : Design of everyday things
Utilisabilité : Design of everyday thingsUtilisabilité : Design of everyday things
Utilisabilité : Design of everyday thingsblobule
 
Estándares Geocientíficos e Interoperables para Emergencias y su Aplicación e...
Estándares Geocientíficos e Interoperables para Emergencias y su Aplicación e...Estándares Geocientíficos e Interoperables para Emergencias y su Aplicación e...
Estándares Geocientíficos e Interoperables para Emergencias y su Aplicación e...Carlos Gabriel Asato
 
Comment utiliser un monde virtuel pour améliorer les résultats des études de ...
Comment utiliser un monde virtuel pour améliorer les résultats des études de ...Comment utiliser un monde virtuel pour améliorer les résultats des études de ...
Comment utiliser un monde virtuel pour améliorer les résultats des études de ...ESD - École Supérieure du Digital
 
Lugre del mundo
Lugre del mundoLugre del mundo
Lugre del mundoandia91
 
Parkinson
ParkinsonParkinson
Parkinsontania92
 
Présentation du projet 2010
Présentation du projet 2010Présentation du projet 2010
Présentation du projet 2010LABAT
 
Activitats tutoria 1r trimestre
Activitats tutoria 1r trimestreActivitats tutoria 1r trimestre
Activitats tutoria 1r trimestrether
 
RÉSUMÉ PRESENTATION - UNIV LIBRE BRUXELLES - BLANCHIMENT ET SECTEUR IMMOBILIE...
RÉSUMÉ PRESENTATION - UNIV LIBRE BRUXELLES - BLANCHIMENT ET SECTEUR IMMOBILIE...RÉSUMÉ PRESENTATION - UNIV LIBRE BRUXELLES - BLANCHIMENT ET SECTEUR IMMOBILIE...
RÉSUMÉ PRESENTATION - UNIV LIBRE BRUXELLES - BLANCHIMENT ET SECTEUR IMMOBILIE...Geert DELRUE
 
Ouvrir la démocratie aux populations via Internet
Ouvrir la démocratie aux populations via InternetOuvrir la démocratie aux populations via Internet
Ouvrir la démocratie aux populations via InternetHervé Djia
 
Tecnologías Aplicadas al Proceso de Enseñanza-Aprendizaje
Tecnologías Aplicadas al Proceso de Enseñanza-AprendizajeTecnologías Aplicadas al Proceso de Enseñanza-Aprendizaje
Tecnologías Aplicadas al Proceso de Enseñanza-AprendizajeJaime Oyarzo Espinosa
 
Memory Analyzer (Eclipse Demo Camp)
Memory Analyzer (Eclipse Demo Camp)Memory Analyzer (Eclipse Demo Camp)
Memory Analyzer (Eclipse Demo Camp)Manuel Boillod
 

Andere mochten auch (20)

Ra sgd
Ra sgdRa sgd
Ra sgd
 
Curso E-marketing pude 2008
Curso E-marketing pude 2008Curso E-marketing pude 2008
Curso E-marketing pude 2008
 
Trabajo De Partero
Trabajo De ParteroTrabajo De Partero
Trabajo De Partero
 
Comunicacion
ComunicacionComunicacion
Comunicacion
 
Presentacion Weblog
Presentacion WeblogPresentacion Weblog
Presentacion Weblog
 
Presentacion M4
Presentacion M4Presentacion M4
Presentacion M4
 
Amistad
AmistadAmistad
Amistad
 
Utilisabilité : Design of everyday things
Utilisabilité : Design of everyday thingsUtilisabilité : Design of everyday things
Utilisabilité : Design of everyday things
 
Estándares Geocientíficos e Interoperables para Emergencias y su Aplicación e...
Estándares Geocientíficos e Interoperables para Emergencias y su Aplicación e...Estándares Geocientíficos e Interoperables para Emergencias y su Aplicación e...
Estándares Geocientíficos e Interoperables para Emergencias y su Aplicación e...
 
Comment utiliser un monde virtuel pour améliorer les résultats des études de ...
Comment utiliser un monde virtuel pour améliorer les résultats des études de ...Comment utiliser un monde virtuel pour améliorer les résultats des études de ...
Comment utiliser un monde virtuel pour améliorer les résultats des études de ...
 
8 minutos
8 minutos8 minutos
8 minutos
 
Lugre del mundo
Lugre del mundoLugre del mundo
Lugre del mundo
 
Parkinson
ParkinsonParkinson
Parkinson
 
Présentation du projet 2010
Présentation du projet 2010Présentation du projet 2010
Présentation du projet 2010
 
Encuesta 4º
Encuesta 4ºEncuesta 4º
Encuesta 4º
 
Activitats tutoria 1r trimestre
Activitats tutoria 1r trimestreActivitats tutoria 1r trimestre
Activitats tutoria 1r trimestre
 
RÉSUMÉ PRESENTATION - UNIV LIBRE BRUXELLES - BLANCHIMENT ET SECTEUR IMMOBILIE...
RÉSUMÉ PRESENTATION - UNIV LIBRE BRUXELLES - BLANCHIMENT ET SECTEUR IMMOBILIE...RÉSUMÉ PRESENTATION - UNIV LIBRE BRUXELLES - BLANCHIMENT ET SECTEUR IMMOBILIE...
RÉSUMÉ PRESENTATION - UNIV LIBRE BRUXELLES - BLANCHIMENT ET SECTEUR IMMOBILIE...
 
Ouvrir la démocratie aux populations via Internet
Ouvrir la démocratie aux populations via InternetOuvrir la démocratie aux populations via Internet
Ouvrir la démocratie aux populations via Internet
 
Tecnologías Aplicadas al Proceso de Enseñanza-Aprendizaje
Tecnologías Aplicadas al Proceso de Enseñanza-AprendizajeTecnologías Aplicadas al Proceso de Enseñanza-Aprendizaje
Tecnologías Aplicadas al Proceso de Enseñanza-Aprendizaje
 
Memory Analyzer (Eclipse Demo Camp)
Memory Analyzer (Eclipse Demo Camp)Memory Analyzer (Eclipse Demo Camp)
Memory Analyzer (Eclipse Demo Camp)
 

Ähnlich wie C++ 11 - Tech Days 2014 in Paris

COURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxCOURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxLuneSabsPericolo1
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Aziz Darouichi
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) univalence
 
Javascript & tools
Javascript & toolsJavascript & tools
Javascript & toolsSlim Soussi
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptMichael Akbaraly
 
20131024 qualité de code et sonar - mug lyon
20131024   qualité de code et sonar - mug lyon20131024   qualité de code et sonar - mug lyon
20131024 qualité de code et sonar - mug lyonClement Bouillier
 
Le langage C.pdf
Le langage C.pdfLe langage C.pdf
Le langage C.pdfNoamHaythem
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosPublicis Sapient Engineering
 
Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Jean Gabès
 
CodeBuilder_DevOpsCenter.pptx
CodeBuilder_DevOpsCenter.pptxCodeBuilder_DevOpsCenter.pptx
CodeBuilder_DevOpsCenter.pptxThomasParaiso1
 
Code flow - Cocoaheads paris
Code flow - Cocoaheads parisCode flow - Cocoaheads paris
Code flow - Cocoaheads parisCocoaHeads France
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)Rui Carvalho
 
Road map to DevOps engineering - Elie Sirius
Road map to DevOps engineering -  Elie SiriusRoad map to DevOps engineering -  Elie Sirius
Road map to DevOps engineering - Elie SiriusGDG Bujumbura
 

Ähnlich wie C++ 11 - Tech Days 2014 in Paris (20)

introduction au CPP
introduction au CPPintroduction au CPP
introduction au CPP
 
De Java à .NET
De Java à .NETDe Java à .NET
De Java à .NET
 
COURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxCOURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptx
 
Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
Javascript & tools
Javascript & toolsJavascript & tools
Javascript & tools
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascript
 
Chap1: Cours en C++
Chap1: Cours en C++Chap1: Cours en C++
Chap1: Cours en C++
 
Cours Ynov JS B1_1
Cours Ynov JS B1_1Cours Ynov JS B1_1
Cours Ynov JS B1_1
 
20131024 qualité de code et sonar - mug lyon
20131024   qualité de code et sonar - mug lyon20131024   qualité de code et sonar - mug lyon
20131024 qualité de code et sonar - mug lyon
 
Le langage C.pdf
Le langage C.pdfLe langage C.pdf
Le langage C.pdf
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
 
Infrastructure as code drupal
Infrastructure as code drupalInfrastructure as code drupal
Infrastructure as code drupal
 
Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)Conférence Shinken à SophiaConf2012 (Jean Gabès)
Conférence Shinken à SophiaConf2012 (Jean Gabès)
 
_JCVFr
_JCVFr_JCVFr
_JCVFr
 
CodeBuilder_DevOpsCenter.pptx
CodeBuilder_DevOpsCenter.pptxCodeBuilder_DevOpsCenter.pptx
CodeBuilder_DevOpsCenter.pptx
 
Code flow - Cocoaheads paris
Code flow - Cocoaheads parisCode flow - Cocoaheads paris
Code flow - Cocoaheads paris
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)
 
Road map to DevOps engineering - Elie Sirius
Road map to DevOps engineering -  Elie SiriusRoad map to DevOps engineering -  Elie Sirius
Road map to DevOps engineering - Elie Sirius
 

C++ 11 - Tech Days 2014 in Paris

  • 1.
  • 2. Bonnes pratiques C++11 avec Visual C++ Loïc Joly - CAST Christophe Pichaud - Sogeti www.castsoftware.com www.fr.sogeti.com Développement C++
  • 3. Donnez votre avis ! Depuis votre smartphone sur : http://notes.mstechdays.fr De nombreux lots à gagner toute les heures !!! Claviers, souris et jeux Microsoft… Merci de nous aider à améliorer les Techdays ! #mstechdays Développement C++
  • 4. PLAN Visual C++ 2013 November 2013 CTP Guide de survie en C++11 Interop WinRT #mstechdays Développement C++
  • 5. Visual C++ 2013 • C++11 : – Le contenu du November 2012 CTP (voir Développer en natif avec C++11 http://microsoft.com/showcase/fr/fr/details/b67dd5c8-9a6e-4bb9-a1d290f3f9ef3a09) – =default, =delete, NSDI, greater<>, make_unique… • C11 : Meilleur support – _Bool, déclaration au milieu de bloc, designated initializer… • Des retouches d’IHM (formatage du #mstechdays Développement C++
  • 6. November 2013 CTP • 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 #mstechdays Développement C++
  • 7. GUIDE DE SURVIE EN C++11 Autour de la sémantique de déplacement #mstechdays Développement C++
  • 8. Intérêt de déplacer Copie Déplacement • La destination vaut la valeur qu’avait la source initialement • La source est inchangée • On peut continuer à utiliser la source • Fournit la strong exception guarantee • Plus lent • • • • • • #mstechdays La destination vaut la valeur qu’avait la source initialement On se moque de l’état de la source, tant qu’il est viable On va éviter d’utiliser la source par la suite Ne fournit que la basic exception guarantee …mais peut souvent être noexcept Plus rapide Développement C++
  • 9. Comment ça marche ? • Lvalue (ça possède un nom, on peut en prendre l’adresse) 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 qu’on est les seuls à accéder à l’objet, on a le droit d’être destructif #mstechdays Développement C++
  • 10. Comment rendre nos classes déplaçables • 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 d’un constructeur de copie • Règle des 5 (ou règle des 0 !) #mstechdays Développement C++
  • 11. Quelques conseils sur les classes déplaçables • 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 d’un 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 ! #mstechdays Développement C++
  • 12. Utiliser dans l’ordre de préférence 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) #mstechdays Développement C++
  • 13. Universal references • 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 à l’aide de std::forward • On n’a pas forcément le droit de toucher à la source ! • Fonctionne souvent assez mal avec la surcharge (car peut déjà tout prendre en charge) #mstechdays Développement C++
  • 14. Transmettre des arguments 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 <class T> void f(T &&t); g(std::forward<T>(t)) #mstechdays Développement C++
  • 15. Et avec des pointeurs intelligents ? Pour Utiliser Une fonction manipulant uniquement l’objet pointé void f(T& t); void f(T *t); // Si l’objet peut ne pas exister void f(observer_ptr<T> t); // au lieu de T* ? Une fonction prenant propriété d’un objet géré par shared_ptr void f(shared_ptr<T> t); Une fonction prenant la propriété unique d’un objet géré par pointeur void f(unique_ptr<T> t); Le reste Plus rare… #mstechdays Développement C++
  • 17. Conception de composants WinRT C# / VB #mstechdays C++/CX Développement C++ C++ avec WRL
  • 18. Pourquoi faire des composants WinRT en C++ Gestion batterie Performance Accès à Win32 #mstechdays Protection contre la décompilation Code existant Développement C++
  • 19. Scénarios d’applications C++ hybrides Interface HTML/JS Interface C#/VB Interface C++ Composants WinRT C++ Composants WinRT C++ Composants WinRT C#/VB #mstechdays Développement C++
  • 20. Le nouveau modèle de composants WinRT • Windows 8 utilise des composants COM – il existe l’interface 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 #mstechdays Développement C++
  • 21. Un composant WinRT • • • • • C’est 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 #mstechdays Développement C++
  • 22. La librairie WRL • Les entêtes sont définies dans – C:Program Files (x86)Windows Kits8.1Includewinrtwrl • async.h • client.h • def.h • event.h • ftm.h • implements.h • internal.h • module.h • wrapperscorewrappers.h #mstechdays Développement C++
  • 23. Un composant WRL Simple import "inspectable.idl"; import "Windows.Foundation.idl"; #define COMPONENT_VERSION 1.0 namespace Library1 { #include "Library1_h.h" namespace ABI { namespace Library1 { interface ILogger; runtimeclass Logger; class Logger : public RuntimeClass<ILogger> { [uuid(3EC4B4D6-14A6-4D0D-BB96-31DA25224A15), version(COMPONENT_VERSION)] InspectableClass(L"Library1.Logger", interface ILogger : Iinspectable BaseTrust) { public: [propget] HRESULT Name([out, retval] HSTRING* value); [propput] HRESULT Name([in] HSTRING value); STDMETHOD(get_Name)(HSTRING* value); HRESULT LogInfo([in] HSTRING value); STDMETHOD(put_Name)(HSTRING value); HRESULT GetInt32([out] int * pValue); STDMETHOD(LogInfo)(HSTRING value); } STDMETHOD(GetInt32)(int * pValue); [version(COMPONENT_VERSION), private: activatable(COMPONENT_VERSION)] runtimeclass Logger std::wstring name; { }; [default] interface ILogger; } ActivatableClass(Logger); } } #mstechdays Développement C++ }
  • 24. Un composant COM WRL #include "Library1_h.h" class Logger : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger> { public: STDMETHOD(LogInfo)(BSTR value); }; #mstechdays 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; } } Développement C++
  • 25. WRL et COM • Attention WRL ne fournit pas de support pour – IDispatch et les interfaces dual, les connections points – L’enregistrement automatique du module • Il faut le faire manuellement avec un .reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}] @="Logger Class" [HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}InprocServer32] @="C:devStoreApp1DebugWRLCOMLibrary1Dll.dll" "ThreadingModel"="Apartment" [HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}Programmable] [HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}TypeLib] @="{F15D3912-E8B8-40C8-8CF3-354F0B8B93CC}" [HKEY_CLASSES_ROOTWow6432NodeCLSID{75DB8F5A-F13F-4E16-A487-9CD26A874654}Version] @="1.0“ #mstechdays Développement C++
  • 26. WRL et les méthodes Async • Exemple de méthode dans la classe Root: Windows.Foundation.IAsyncOperation<ILogger> 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 !"); } #mstechdays Développement C++
  • 27. Un composant WRL et les méthodes Async interface IRoot; runtimeclass Root; [uuid(3EC4B4D6-14A6-4D0D-BB96-31DA25224A16), version(COMPONENT_VERSION)] interface IRoot : IInspectable { HRESULT GetLoggerAsync([out][retval] Windows.Foundation.IAsyncOperation<ILogger*>** value); } [version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)] runtimeclass Root { [default] interface IRoot; } #mstechdays Développement C++
  • 28. Le composant WRL avec une méthode Async #include "Library1_h.h" namespace ABI { namespace Library1 { class Root : public RuntimeClass<IRoot> { InspectableClass(L"Library1.Root", BaseTrust) public: STDMETHOD(GetLoggerAsync)(Windows::Foundation::IAsyncOperation<ILogger*>** value); }; ActivatableClass(Logger); } } • • Il faut maintenant implémenter cette interface C:Program Files (x86)Windows Kits8.1Includewinrt – windows.foundation.collections.h #mstechdays Développement C++
  • 29. La routine GetLoggerAsync() namespace ABI { namespace Library1 { STDMETHODIMP Root::GetLoggerAsync(Windows::Foundation::IAsyncOperation<ILogger*>** value) { ComPtr<task_based_async_operation<ILogger>> pObject = Make<task_based_async_operation<ILogger>>( std::async([&]() -> ILogger* { ComPtr<Logger> p = Make<Logger>(); return p.Detach(); })); *value = pObject.Detach(); return S_OK; } • La magie est contenue dans la classe task_based_async_operation via PPL Tasks. #mstechdays Développement C++
  • 30. WRL et les Collections • Exemple de méthode dans la classe Root: Windows.Foundation.Collections::IVector<HSTRING> Getvector(); • Exemple de client XAML C#: private async void Button_Click(object sender, RoutedEventArgs e) { Library1.Root root = new Root(); IList<string> list = root.GetVector(); foreach (string s in list) { … } } #mstechdays Développement C++
  • 31. Un composant WRL et les collections interface IRoot; runtimeclass Root; [uuid(3EC4B4D6-14A6-4D0D-BB96-31DA25224A16), version(COMPONENT_VERSION)] interface IRoot : IInspectable { HRESULT GetVector([out][retval] Windows.Foundation.Collections.IVector<HSTRING>** value); } [version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)] runtimeclass Root { [default] interface IRoot; } #mstechdays Développement C++
  • 32. Le composant WRL avec les collections #include "Library1_h.h" namespace ABI { namespace Library1 { class Root : public RuntimeClass<IRoot> { InspectableClass(L"Library1.Root", BaseTrust) public: STDMETHOD(GetVector)(Windows::Foundation::Collections::IVector<HSTRING>** value); }; ActivatableClass(Logger); } } • • Il faut maintenant implémenter cette interface C:Program Files (x86)Windows Kits8.1Includewinrt – windows.foundation.collections.h #mstechdays Développement C++
  • 33. La routine GetVector() namespace ABI { namespace Library1 { STDMETHODIMP Root::GetVector(Windows::Foundation::Collections::IVector<HSTRING>** value) { ComPtr<Vector<HSTRING>> v = Make<Vector<HSTRING>>(); 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<T>. #mstechdays Développement C++
  • 34. WRL et les opérations asynchrones • Support en C++/CX via les ‘PPL Taks’ IAsyncOperation<int>^ CalculateAnswer() { return concurrency::create_async([]() -> int { // faire une opération longue ici… return 42; }); } IAsyncOperation<String^>^ CalculateQuestion() { return create_async([]() -> String^ { // faire une opération longue ici… return ref new String(L“Hello IAsyncOperation<T>…"); }); } #mstechdays Développement C++
  • 37. C/C++ French user group : cpp-frug@googlegroups.com #mstechdays Développement C++
  • 40. Titre et contenu • 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. #mstechdays Développement C++
  • 42. Exemple de graphs Sales 1st Qtr #mstechdays 2nd Qtr Développement C++ 3rd Qtr 4th Qtr
  • 43. Titre et 2 colonnes • Colonne 1 #mstechdays • Colonne 2 Développement C++
  • 44. Titre comparaison Elément 1 Elément 2 • Paramètre 1 • Paramètre 2 • Paramètre 1 • Paramètre 2 #mstechdays Développement C++
  • 45. 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. #mstechdays Développement C++
  • 46. NOM DÉMO Sous titre démo #mstechdays Développement C++