50
palais des congrès Paris 7, 8 et 9 février 2012

Les nouveautés de C++11 : Ecrire du C++ Moderne

Embed Size (px)

DESCRIPTION

Le langage C++ a toujours la réputation d’un langage complexe, demandant une rigueur de tous les instants et qui peut en rebuter plus d’un. Mais avec l’arrivée de la nouvelle norme C++11 et de son intégration dans Visual Studio 11 (et intégration partielle dans Visual Studio 2010), elle permet comme le souligne Herb Sutter, d’écrire désormais du code "Clean, Safe and Fast", nous passons à l'ère du C++ moderne.

Citation preview

Page 1: Les nouveautés de C++11 : Ecrire du C++ Moderne

palais des

congregraves

Paris

7 8 et 9

feacutevrier 2012

Christophe PichaudConsultant Architecte Sogeti

Les nouveauteacutes de C++Ecrire du code C++ Moderne (LAN207)

Alain ZanchettaConsultant ArchitecteMicrosoft

C++

Beaucoup de deacuteveloppeurs connaissent le C++ mais nrsquoen eacutecrivent qursquooccasionnellement

Utilisation tactique (Win32 COM) plus du C que du C++

Manque de temps pour suivre les eacutevolutions du langage

Le C++ fait peurhellip

Il se passe laquo enfin raquo quelque chose dans le monde C++

Regain drsquointeacuterecirct de la part des deacuteveloppeurs

Evolutions du langage ndash standard C++ 11

Cette preacutesentation montre le nouveau visage du C++

Plus simple plus sucircr

Et toujours aussi performant

Level 400 =gt 200

Pourquoi cette session C++

Pourquoi choisir C++

ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but

efficient code is a lot easierrdquo ndash Andrei Alexandrescu

The C++ Standards Commitee

httpwwwopen-stdorgjtc1sc22wg21

2011 Approbation du standard C++0x

Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo

2008 Draft pour C++0x

Impleacutementation (partielle) dans Visual C++ 2010

2005 TR1= Library Technical Report 1

Visual C++ 2008 + TR 1

2003 TC1 = corrections C++98

1998 C++ devient un standard ISO (laquo C++98 raquo)

La normalisation du C++

TR1 C++0x C++ 11

TR1 - Technical Report 1shared_ptrltTgt

weak_ptrltTgt

unique_ptrltTgt

regex

tuple

array

hellip

C++ 0xlambdas

r-value reference

auto

decltype

static_assert

Thread

mutex

futureltTgt

vectorltvectorltintgtgt

variadic templates

hellip

C++ mythes et reacutealiteacutes

Template meta-programming

Des macros et de goto

Crsquoest du C

Un langage orienteacute objet compliqueacute

Bas niveau

Non seacutecuriseacutee dangereux

Code dur agrave maintenir

Code crado mais je continue sur le mecircme modegravelehellip

Compliqueacute agrave apprendre

Peu productif

cast

new delete

pointers

Orienteacute objet

Un bon code

principes et techniques

Interfaces riches

Structure de donneacutees compactes et efficaces

le style C++ 11

gestion des erreurs

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 2: Les nouveautés de C++11 : Ecrire du C++ Moderne

Christophe PichaudConsultant Architecte Sogeti

Les nouveauteacutes de C++Ecrire du code C++ Moderne (LAN207)

Alain ZanchettaConsultant ArchitecteMicrosoft

C++

Beaucoup de deacuteveloppeurs connaissent le C++ mais nrsquoen eacutecrivent qursquooccasionnellement

Utilisation tactique (Win32 COM) plus du C que du C++

Manque de temps pour suivre les eacutevolutions du langage

Le C++ fait peurhellip

Il se passe laquo enfin raquo quelque chose dans le monde C++

Regain drsquointeacuterecirct de la part des deacuteveloppeurs

Evolutions du langage ndash standard C++ 11

Cette preacutesentation montre le nouveau visage du C++

Plus simple plus sucircr

Et toujours aussi performant

Level 400 =gt 200

Pourquoi cette session C++

Pourquoi choisir C++

ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but

efficient code is a lot easierrdquo ndash Andrei Alexandrescu

The C++ Standards Commitee

httpwwwopen-stdorgjtc1sc22wg21

2011 Approbation du standard C++0x

Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo

2008 Draft pour C++0x

Impleacutementation (partielle) dans Visual C++ 2010

2005 TR1= Library Technical Report 1

Visual C++ 2008 + TR 1

2003 TC1 = corrections C++98

1998 C++ devient un standard ISO (laquo C++98 raquo)

La normalisation du C++

TR1 C++0x C++ 11

TR1 - Technical Report 1shared_ptrltTgt

weak_ptrltTgt

unique_ptrltTgt

regex

tuple

array

hellip

C++ 0xlambdas

r-value reference

auto

decltype

static_assert

Thread

mutex

futureltTgt

vectorltvectorltintgtgt

variadic templates

hellip

C++ mythes et reacutealiteacutes

Template meta-programming

Des macros et de goto

Crsquoest du C

Un langage orienteacute objet compliqueacute

Bas niveau

Non seacutecuriseacutee dangereux

Code dur agrave maintenir

Code crado mais je continue sur le mecircme modegravelehellip

Compliqueacute agrave apprendre

Peu productif

cast

new delete

pointers

Orienteacute objet

Un bon code

principes et techniques

Interfaces riches

Structure de donneacutees compactes et efficaces

le style C++ 11

gestion des erreurs

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 3: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++

Beaucoup de deacuteveloppeurs connaissent le C++ mais nrsquoen eacutecrivent qursquooccasionnellement

Utilisation tactique (Win32 COM) plus du C que du C++

Manque de temps pour suivre les eacutevolutions du langage

Le C++ fait peurhellip

Il se passe laquo enfin raquo quelque chose dans le monde C++

Regain drsquointeacuterecirct de la part des deacuteveloppeurs

Evolutions du langage ndash standard C++ 11

Cette preacutesentation montre le nouveau visage du C++

Plus simple plus sucircr

Et toujours aussi performant

Level 400 =gt 200

Pourquoi cette session C++

Pourquoi choisir C++

ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but

efficient code is a lot easierrdquo ndash Andrei Alexandrescu

The C++ Standards Commitee

httpwwwopen-stdorgjtc1sc22wg21

2011 Approbation du standard C++0x

Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo

2008 Draft pour C++0x

Impleacutementation (partielle) dans Visual C++ 2010

2005 TR1= Library Technical Report 1

Visual C++ 2008 + TR 1

2003 TC1 = corrections C++98

1998 C++ devient un standard ISO (laquo C++98 raquo)

La normalisation du C++

TR1 C++0x C++ 11

TR1 - Technical Report 1shared_ptrltTgt

weak_ptrltTgt

unique_ptrltTgt

regex

tuple

array

hellip

C++ 0xlambdas

r-value reference

auto

decltype

static_assert

Thread

mutex

futureltTgt

vectorltvectorltintgtgt

variadic templates

hellip

C++ mythes et reacutealiteacutes

Template meta-programming

Des macros et de goto

Crsquoest du C

Un langage orienteacute objet compliqueacute

Bas niveau

Non seacutecuriseacutee dangereux

Code dur agrave maintenir

Code crado mais je continue sur le mecircme modegravelehellip

Compliqueacute agrave apprendre

Peu productif

cast

new delete

pointers

Orienteacute objet

Un bon code

principes et techniques

Interfaces riches

Structure de donneacutees compactes et efficaces

le style C++ 11

gestion des erreurs

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 4: Les nouveautés de C++11 : Ecrire du C++ Moderne

Beaucoup de deacuteveloppeurs connaissent le C++ mais nrsquoen eacutecrivent qursquooccasionnellement

Utilisation tactique (Win32 COM) plus du C que du C++

Manque de temps pour suivre les eacutevolutions du langage

Le C++ fait peurhellip

Il se passe laquo enfin raquo quelque chose dans le monde C++

Regain drsquointeacuterecirct de la part des deacuteveloppeurs

Evolutions du langage ndash standard C++ 11

Cette preacutesentation montre le nouveau visage du C++

Plus simple plus sucircr

Et toujours aussi performant

Level 400 =gt 200

Pourquoi cette session C++

Pourquoi choisir C++

ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but

efficient code is a lot easierrdquo ndash Andrei Alexandrescu

The C++ Standards Commitee

httpwwwopen-stdorgjtc1sc22wg21

2011 Approbation du standard C++0x

Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo

2008 Draft pour C++0x

Impleacutementation (partielle) dans Visual C++ 2010

2005 TR1= Library Technical Report 1

Visual C++ 2008 + TR 1

2003 TC1 = corrections C++98

1998 C++ devient un standard ISO (laquo C++98 raquo)

La normalisation du C++

TR1 C++0x C++ 11

TR1 - Technical Report 1shared_ptrltTgt

weak_ptrltTgt

unique_ptrltTgt

regex

tuple

array

hellip

C++ 0xlambdas

r-value reference

auto

decltype

static_assert

Thread

mutex

futureltTgt

vectorltvectorltintgtgt

variadic templates

hellip

C++ mythes et reacutealiteacutes

Template meta-programming

Des macros et de goto

Crsquoest du C

Un langage orienteacute objet compliqueacute

Bas niveau

Non seacutecuriseacutee dangereux

Code dur agrave maintenir

Code crado mais je continue sur le mecircme modegravelehellip

Compliqueacute agrave apprendre

Peu productif

cast

new delete

pointers

Orienteacute objet

Un bon code

principes et techniques

Interfaces riches

Structure de donneacutees compactes et efficaces

le style C++ 11

gestion des erreurs

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 5: Les nouveautés de C++11 : Ecrire du C++ Moderne

Pourquoi choisir C++

ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but

efficient code is a lot easierrdquo ndash Andrei Alexandrescu

The C++ Standards Commitee

httpwwwopen-stdorgjtc1sc22wg21

2011 Approbation du standard C++0x

Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo

2008 Draft pour C++0x

Impleacutementation (partielle) dans Visual C++ 2010

2005 TR1= Library Technical Report 1

Visual C++ 2008 + TR 1

2003 TC1 = corrections C++98

1998 C++ devient un standard ISO (laquo C++98 raquo)

La normalisation du C++

TR1 C++0x C++ 11

TR1 - Technical Report 1shared_ptrltTgt

weak_ptrltTgt

unique_ptrltTgt

regex

tuple

array

hellip

C++ 0xlambdas

r-value reference

auto

decltype

static_assert

Thread

mutex

futureltTgt

vectorltvectorltintgtgt

variadic templates

hellip

C++ mythes et reacutealiteacutes

Template meta-programming

Des macros et de goto

Crsquoest du C

Un langage orienteacute objet compliqueacute

Bas niveau

Non seacutecuriseacutee dangereux

Code dur agrave maintenir

Code crado mais je continue sur le mecircme modegravelehellip

Compliqueacute agrave apprendre

Peu productif

cast

new delete

pointers

Orienteacute objet

Un bon code

principes et techniques

Interfaces riches

Structure de donneacutees compactes et efficaces

le style C++ 11

gestion des erreurs

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 6: Les nouveautés de C++11 : Ecrire du C++ Moderne

The C++ Standards Commitee

httpwwwopen-stdorgjtc1sc22wg21

2011 Approbation du standard C++0x

Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo

2008 Draft pour C++0x

Impleacutementation (partielle) dans Visual C++ 2010

2005 TR1= Library Technical Report 1

Visual C++ 2008 + TR 1

2003 TC1 = corrections C++98

1998 C++ devient un standard ISO (laquo C++98 raquo)

La normalisation du C++

TR1 C++0x C++ 11

TR1 - Technical Report 1shared_ptrltTgt

weak_ptrltTgt

unique_ptrltTgt

regex

tuple

array

hellip

C++ 0xlambdas

r-value reference

auto

decltype

static_assert

Thread

mutex

futureltTgt

vectorltvectorltintgtgt

variadic templates

hellip

C++ mythes et reacutealiteacutes

Template meta-programming

Des macros et de goto

Crsquoest du C

Un langage orienteacute objet compliqueacute

Bas niveau

Non seacutecuriseacutee dangereux

Code dur agrave maintenir

Code crado mais je continue sur le mecircme modegravelehellip

Compliqueacute agrave apprendre

Peu productif

cast

new delete

pointers

Orienteacute objet

Un bon code

principes et techniques

Interfaces riches

Structure de donneacutees compactes et efficaces

le style C++ 11

gestion des erreurs

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 7: Les nouveautés de C++11 : Ecrire du C++ Moderne

TR1 C++0x C++ 11

TR1 - Technical Report 1shared_ptrltTgt

weak_ptrltTgt

unique_ptrltTgt

regex

tuple

array

hellip

C++ 0xlambdas

r-value reference

auto

decltype

static_assert

Thread

mutex

futureltTgt

vectorltvectorltintgtgt

variadic templates

hellip

C++ mythes et reacutealiteacutes

Template meta-programming

Des macros et de goto

Crsquoest du C

Un langage orienteacute objet compliqueacute

Bas niveau

Non seacutecuriseacutee dangereux

Code dur agrave maintenir

Code crado mais je continue sur le mecircme modegravelehellip

Compliqueacute agrave apprendre

Peu productif

cast

new delete

pointers

Orienteacute objet

Un bon code

principes et techniques

Interfaces riches

Structure de donneacutees compactes et efficaces

le style C++ 11

gestion des erreurs

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 8: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++ mythes et reacutealiteacutes

Template meta-programming

Des macros et de goto

Crsquoest du C

Un langage orienteacute objet compliqueacute

Bas niveau

Non seacutecuriseacutee dangereux

Code dur agrave maintenir

Code crado mais je continue sur le mecircme modegravelehellip

Compliqueacute agrave apprendre

Peu productif

cast

new delete

pointers

Orienteacute objet

Un bon code

principes et techniques

Interfaces riches

Structure de donneacutees compactes et efficaces

le style C++ 11

gestion des erreurs

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 9: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++ refreshed

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 10: Les nouveautés de C++11 : Ecrire du C++ Moderne

Soit un point A

Soit un ensemble de polygones

Trouver le premier polygone qui contient A

NB ce nrsquoest pas un problegraveme de matheacutematiques

mais une petite illustration de lrsquoeacutevolution du C++

Illustration

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 11: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++ laquo classique raquo C

11

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 12: Les nouveautés de C++11 : Ecrire du C++ Moderne

Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire

difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees

Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++

Mais il y a un meacutecanisme de libeacuteration deacuteterministe

Gestion de la meacutemoire

Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant

Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg

Destruction automatique et de-

allocation de w et wg

class widget

privategadget g

publicvoid draw()

void f() widget w

wdraw()

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 13: Les nouveautés de C++11 : Ecrire du C++ Moderne

Principe RAII = Resource Acquisition Is Initialisation

Applicable agrave toutes les ressources laquo preacutecieuses

Meacutemoire

fichiers sockets handles Windows

Destruction deacuteterministe (ie pas besoin de laquo using raquo)

Libeacuteration deacuteterministe

ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo

Bjarne Stroustrup

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 14: Les nouveautés de C++11 : Ecrire du C++ Moderne

Un template C++ disponible dans ltmemorygt

shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp

Baseacute sur le comptage de reacutefeacuterences

Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs

Compatible avec les conteneurs STL

Compatible avec le polymorphisme

shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences

Libeacuteration particuliegravere

shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)

Caracteacuteristiques de

shared_ptrltTgt

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 15: Les nouveautés de C++11 : Ecrire du C++ Moderne

Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T

La gestion des reacutefeacuterences (usesweaks) est dans le

shared_ptr

Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt

Srsquoincorpore dans le code sans modifier les types existants

Un mecircme type peut ecirctre manipuleacute parfois via un

shared_ptr et drsquoautres fois via drsquoautres meacutecanismes

shared_ptr est Non-Intrusif

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 16: Les nouveautés de C++11 : Ecrire du C++ Moderne

VS 2008 SP1 (VC9 SP1)

shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)

VS 2010 (VC10)

shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)

shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)

voire auto sp = allocate_sharedltTgt(alloc args)

Simple et eacutelegant

Eacutecrire le type T une seule fois

Performant

Une seule allocation pour lrsquoobjet et le bloc de comptage

make_sharedltTgt()

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 17: Les nouveautés de C++11 : Ecrire du C++ Moderne

Patterns parent enfants observer

Solution weak_ptrltTgt lock() expired()

lock transformation en shared_ptr

expired tester si la ressource est disponible

Casser les cycles avec weak_ptrltTgt

static void do_lock (const char title weak_ptrltresourcegt wp)

shared_ptrltresourcegt sp = wplock()show(title sp)

int main()

demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0

int main()

demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 18: Les nouveautés de C++11 : Ecrire du C++ Moderne

Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))

Remplace auto_ptr qui est obsolegravete

Compatible avec les collections STL (containers)

Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))

unique_ptrltTgt

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 19: Les nouveautés de C++11 : Ecrire du C++ Moderne

Effective C++ Third Edition (2005) by Scott Meyers

shared_ptr may be the most widely useful component in TR1

C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu

Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr

Paroles drsquoexperts

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 20: Les nouveautés de C++11 : Ecrire du C++ Moderne

delete

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 21: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = begbreak

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) delete begreturn ret

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 22: Les nouveautés de C++11 : Ecrire du C++ Moderne

nullptr exprime un pointeur nul

Ce nrsquoest pas un int

class Foo

public

Foo(const char s)

Foo(int n)

hellip

Foo f(NULL)

Foo f(nullptr)

nullptr

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 23: Les nouveautés de C++11 : Ecrire du C++ Moderne

NULL

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 24: Les nouveautés de C++11 : Ecrire du C++ Moderne

Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =

polysbegin()

long et fastidieux agrave eacutecrire

Maintenant avec laquo auto raquo

auto beg = polysbegin()

Type deacuteduit par le compilateur

Equivalent de laquo var raquo en C

auto

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 25: Les nouveautés de C++11 : Ecrire du C++ Moderne

auto utilise les regravegles de deacutetection drsquoarguments des

templates

const auto p = foo et const autoamp r = bar compilent

auto

Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute

Permet drsquoeacuteviter les erreurs de types troncations hellip

Fonctionne tregraves bien avec les types comme les

lambdas

auto pourquoi lrsquoutiliser

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 26: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++ C

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt

iterator beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 27: Les nouveautés de C++11 : Ecrire du C++ Moderne

RValue = tout ce qui nrsquoest pas LValue

Les reacutefeacuterences de Rvalue permettent deux choses importantes

Deacuteplacement (move semantics) pour la performance

Perfect forwarding pour la geacuteneacutericiteacute

= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)

Ex make_shared

Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre

Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc

Les conteneurs STL sont ldquomove awarerdquo

Move Semantics Perfect

Forwarding

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 28: Les nouveautés de C++11 : Ecrire du C++ Moderne

class my_class BigHugeData data

publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr

hellip

Meacutecanique du Move Value Types

my_class f()my_class tmphellipreturn tmp

void main()my_class c = f()

Appel du Move Constructor

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 29: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++ C

29

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()

beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 30: Les nouveautés de C++11 : Ecrire du C++ Moderne

une classe possegravede par deacutefaut 5 opeacuterations

Un constructeur par copie

Un opeacuterateur de copie

Un constructeur de move

Un opeacuterateur de move

Un destructeur

Attention aux impleacutementations par deacutefaut

Une classe C++11 type

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 31: Les nouveautés de C++11 : Ecrire du C++ Moderne

Indiquer explicitement un opeacuterateur de copie par deacutefault

class Y

Yamp operator=(const Yamp) = default default copy semantics

Y(const Yamp) = default

Indiquer lrsquointerdiction de la copieclass X

Xamp operator=(const Xamp) = delete Disallow copying

X(const Xamp) = delete

=default et =delete

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 32: Les nouveautés de C++11 : Ecrire du C++ Moderne

vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )

arrayltstring50gt a

Conteneurs STL

mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

unordered_mapltstring stringgt phone

phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo

unordered_multimapltstring stringgt phone

phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo

phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo

container par deacutefaut vector

compact efficace cache preacutefetch

dictionary map (arbre) ou unordered_map (hash)

vecteur de taillle fixe array

compact efficace cache preacutefetch

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 33: Les nouveautés de C++11 : Ecrire du C++ Moderne

vectorltintgt vfor (auto i = vbegin() i = vend() ++i)

i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)

i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip

cbegin() cend() crbegin() crend()

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 34: Les nouveautés de C++11 : Ecrire du C++ Moderne

Parcours simples

Exemple for_each = le plus simple

Parcours avec transformations

Exemple copy = copie tous les eacuteleacutements reacutepondant agrave

une condition

Tris

Exemples sort stable_sort lower_bound

Algorithmes trois cateacutegories

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 35: Les nouveautés de C++11 : Ecrire du C++ Moderne

All of

Any of

None of

For each

Find

Find end

Find first

Adjacent Find

Count

Mismatch

Equal

Is permutation

Search

Parcours simples

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 36: Les nouveautés de C++11 : Ecrire du C++ Moderne

templateltclass InputIterator class Predicategt

InputIterator find_if(InputIterator firstInputIterator last

Predicate pred)

Retourne le premier eacuteleacutement veacuterifiant le preacutedicat

Predicate

Fonctions

Classe surchargeant operator()

Lambda

Exemple Find first

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 37: Les nouveautés de C++11 : Ecrire du C++ Moderne

Copy

Move

Swap

Transform

Replace

Fill

Generate

Remove

Unique

Reverse

Rotate

Random shuffle

Partitions

Transformations

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 38: Les nouveautés de C++11 : Ecrire du C++ Moderne

templateltclass InputIterator class OutputIteratorclass UnaryOperationgt

OutputIterator transform(InputIterator firstInputIterator last

OutputIterator result

UnaryOperation op)

Exemple impression de tous les eacuteleacutements drsquoun conteneur

copy(pointsbegin() pointsend()

ostream_iteratorltCPointgt(cout n ))

Exemple Transform

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 39: Les nouveautés de C++11 : Ecrire du C++ Moderne

Sort

Stable_sort

Partial_sort

Nth element

Binary search lower_bound upper_bound

Merge

Tri et assimileacutes

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 40: Les nouveautés de C++11 : Ecrire du C++ Moderne

templateltclass RandomAccessIterator class Comparegt

void sort(RandomAccessIterator first

RandomAccessIterator last

Compare comp)

Trie les eacuteleacutements selon laquo comp raquo

Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)

return pt1Y() gt pt2Y()

sort(pointsbegin() pointsend() PlusHaut)

Exemple sort

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 41: Les nouveautés de C++11 : Ecrire du C++ Moderne

Function for_each(InputIterator first InputIterator last Function f)

InputIterator find_if(InputIterator first InputIterator last Predicate pred)

void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)

Fonctions et preacutedicats

Fonctions simples bool PlusHaut(CPoint amppt1

CPoint amppt2)return pt1Y() gt pt2Y()

Classes surchargeant () class DistancePoint protected

const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)

_ptr(ptr)

bool operator()(CPoint amppt1 CPoint amppt2)

return _ptrDistance2(pt1)lt _ptrDistance2(pt2)

Et lambdas

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 42: Les nouveautés de C++11 : Ecrire du C++ Moderne

Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes

La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )

Est eacutequivalente agravestruct LambdaFunctor

void operator()(int n) const cout ltlt n ltlt

hellipfor_each(vbegin() vend() LambdaFunctor)

Le BA BA des lambdas

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 43: Les nouveautés de C++11 : Ecrire du C++ Moderne

Une lambda peut contenir plusieurs instructions

void par deacutefaut -gt type pour preacuteciser le type de retour

[] sert agrave indiquer ce qursquoon doit capturer du contexte

Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())

Lambda Stateless []

Les copies captureacutees laquo survivent raquo agrave leur contexte

Possibiliteacute de capture par reacutefeacuterence

Capture de toutes les variables [=] ou [amp]

Compleacutements

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 44: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++ C

44

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys(polys)

for (auto beg = polysbegin()beg = polysend()++beg)

if ((beg)-gtContains(pt))return beg

return nullptr

Polygon Search(int xint y)

Point pt

= new Point(xy)ListltPolygongt polys

= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 45: Les nouveautés de C++11 : Ecrire du C++ Moderne

C++ 98 C++ 2011

45

CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg)-gtContains(pt)) ret = beg

for (vectorltCPolygongtiterator

beg = polysbegin()beg=polysend()++beg)

if ((beg) ampamp (bet = ret)) deletebeg

return ret

shared_ptrltCPolygongt Search(int xint y)

CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)

end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)

)return (found = polysend())

found nullptr

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 46: Les nouveautés de C++11 : Ecrire du C++ Moderne

Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999

listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC

mapltvectorltstringgtvectorltintgtgt years =

MauriceVincent Wilkes1913 1945 1951 1967 2000

Martin Ritchards 1982 2003 2007

David John Wheeler 1927 1947 1951 2004

Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt

vector (stdinitializer_listltEgt s) initializer-list constructor

Initialisation des listes

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 47: Les nouveautés de C++11 : Ecrire du C++ Moderne

VC++ amp C++11

VC11Beta

VC11RTM

OOBCTP

OOBRTM

Feb2012

+ C++11range-for

finaloverride

Out-Of-BandReleases

+ progressively roll out C++11 initializer lists template

aliases variadic templates constexpr noexcept =defaultdelete hellip

VC11DP

Sep2011

+ completeC++11 stdlib

threadmutexasync future hellip+ track changes

(lambdas ampamp hellip)

Techdays 2012

VC10RTM

Apr2010

+ lambdas moveampamp

auto decltypeauto fn decls

extern templatenullptr hellip Survey bitlymscpp11

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 48: Les nouveautés de C++11 : Ecrire du C++ Moderne

Systeacutematiser lrsquousage des Smart Pointers = plus de delete

shared_ptr weak_ptr unique_ptr auto_ptr

make_shared

Oublier NULL et utiliser null_ptr

Capitaliser sur les conteneurs et algorithmes de la STL

Inteacutegrer le deacuteplacement dans les membres speacuteciaux

A retenir

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 49: Les nouveautés de C++11 : Ecrire du C++ Moderne

Le standard C++

httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf

Channel 9 Going Deep (STL TR1 etc)

httpchannel9msdncomShowsGoing+Deep

Channel 9 Going Native

httpchannel9msdncomEventsGoingNativeGoingNative-2012

C++ Sessions de la Build 2011

httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status

Whats New for Visual C++ in Visual Studio 11 Developer Preview

httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx

Blog eacutequipe VC++

httpblogsmsdncombvcblog

Pour aller plus loin

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps

Page 50: Les nouveautés de C++11 : Ecrire du C++ Moderne

Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp

Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr

Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure

wwwwindowsazurefr

Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN

wwwvisualstudiofr

Pour aller plus loin

10 feacutevrier

2012Live Meeting

Open Data - Deacutevelopper des applications riches avec le protocole Open

Data

16 feacutevrier

2012Live Meeting

Azure series - Deacutevelopper des applications sociales sur la plateforme

Windows Azure

17 feacutevrier

2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs

21 feacutevrier

2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities

2 mars

2012Live Meeting

Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7

iOS et Android

6 mars

2012Live Meeting Nuget et ALM

9 mars

2012Live Meeting Kinect - Bien geacuterer la vie de son capteur

13 mars

2012Live Meeting Sharepoint series - Automatisation des tests

14 mars

2012Live Meeting

TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de

deacuteveloppement

15 mars

2012Live Meeting

Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud

avec Visual Studio 2010

16 mars

2012Live Meeting

Applications METRO design - Deacutesossage en regravegle dun template METRO

javascript

20 mars

2012Live Meeting

Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees

Inteacutegration Silverlight

23 mars

2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application

Prochaines sessions des Dev Camps