<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Farscape</title>
	<atom:link href="https://blog.developpez.com/farscape/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/farscape</link>
	<description></description>
	<lastBuildDate>Thu, 30 Sep 2010 08:33:50 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Visual C++ 2010 / C++ 0X: utilisation des expressions lambda</title>
		<link>https://blog.developpez.com/farscape/p9281/visualcmfc/visual_c_2010_c_0x_utilisation_des_expre</link>
		<comments>https://blog.developpez.com/farscape/p9281/visualcmfc/visual_c_2010_c_0x_utilisation_des_expre#comments</comments>
		<pubDate>Mon, 13 Sep 2010 05:00:00 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Après avoir abordé le Trailing return type dans mon dernier billet, passons aux &#171;&#160;Expressions lambda&#160;&#187;. Considérons la classe ci-dessous : class Adherent { public: &#160; Adherent(LPCTSTR szNom,LPCTSTR szPrenom,const int nAge) &#160; { &#160; &#160; &#160; &#160;if(szNom==nullptr &#124;&#124; szPrenom==nullptr &#124;&#124; nAge&#60;=0) &#160; &#160; &#160; &#160; AfxThrowInvalidArgException(); &#160; &#160; &#160; &#160;m_strNom=szNom; &#160; &#160; &#160; &#160;m_strPrenom=szPrenom; &#160; &#160; &#160; &#160;m_nAge=nAge; &#160; } public: &#160; CString m_strNom,m_strPrenom; &#160; int m_nAge; }; Cette classe très simple permet d’enregistrer les informations [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Après avoir abordé le <a href="http://blog.developpez.com/farscape/p8925/visualc-mfc/visual-c-2010-c-0x-utilisation-du-traili/">Trailing return type</a> dans mon dernier billet, passons aux &laquo;&nbsp;Expressions lambda&nbsp;&raquo;.<br />
Considérons la classe ci-dessous :<br />
<span id="more-37"></span></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class Adherent <br />
{ <br />
public: <br />
&nbsp; Adherent(LPCTSTR szNom,LPCTSTR szPrenom,const int nAge) <br />
&nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp;if(szNom==nullptr || szPrenom==nullptr || nAge&lt;=0) <br />
&nbsp; &nbsp; &nbsp; &nbsp; AfxThrowInvalidArgException(); <br />
&nbsp; &nbsp; &nbsp; &nbsp;m_strNom=szNom; <br />
&nbsp; &nbsp; &nbsp; &nbsp;m_strPrenom=szPrenom; <br />
&nbsp; &nbsp; &nbsp; &nbsp;m_nAge=nAge; <br />
&nbsp; } <br />
public: <br />
&nbsp; CString m_strNom,m_strPrenom; <br />
&nbsp; int m_nAge; <br />
};</div></div>
<p>Cette classe très simple permet d’enregistrer les informations d’un adhérent,<br />
Supposons maintenant que je maintienne un tableau en mémoire de mes adhérents et que je veuille le trier par l’âge de l’adhérent.<br />
Je vais « naturellement » utiliser la classe <strong>vector</strong> et un foncteur pour trier mon <strong>vector</strong>.<br />
Le code ressemblera donc à ceci :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">struct SortAdherentAge <br />
{ <br />
&nbsp; bool operator()(const Adherent &amp;ad1,const Adherent &amp;ad2) const <br />
&nbsp; { <br />
&nbsp; &nbsp; return ad1.m_nAge &lt; ad2.m_nAge; <br />
&nbsp; } <br />
};</div></div>
<p>L’utilisation plus loin dans le code donnera ceci:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; std::vector &lt;Adherent&gt; vAdherent; <br />
&nbsp;<br />
&nbsp; vAdherent.push_back(Adherent(_T(&quot;Marcel&quot;),_T(&quot;dupont&quot;),50)); <br />
&nbsp; vAdherent.push_back(Adherent(_T(&quot;alain&quot;),_T(&quot;machin&quot;),60)); <br />
&nbsp; vAdherent.push_back(Adherent(_T(&quot;patrick&quot;),_T(&quot;meyer&quot;),30)); <br />
&nbsp;<br />
&nbsp; std::sort(vAdherent.begin(),vAdherent.end(),SortAdherentAge());</div></div>
<p>Les foncteurs sont un moyen très puissant pour personnaliser les algorithmes standard de la <strong>STL</strong>, malheureusement leur définition est peu pratique car elle nécessite d’écrire une classe entière comme <strong>SortAdherentAge</strong> dans mon exemple.<br />
Le second défaut est que cette classe n’est pas définit à l’emplacement dans le code source où on va l’utiliser, ce qui rend leur utilisation plus difficile.<br />
C’est là qu’intervient les expressions lambda qui vont gommer tous ces défauts.<br />
&#8195;</p>
<p>Reprenons maintenant le même exemple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">std::vector &lt;Adherent&gt; vAdherent; <br />
&nbsp;<br />
&nbsp; vAdherent.push_back(Adherent(_T(&quot;Marcel&quot;),_T(&quot;dupont&quot;),50)); <br />
&nbsp; vAdherent.push_back(Adherent(_T(&quot;alain&quot;),_T(&quot;machin&quot;),60)); <br />
&nbsp; vAdherent.push_back(Adherent(_T(&quot;patrick&quot;),_T(&quot;meyer&quot;),30)); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; std::sort(vAdherent.begin(),vAdherent.end(), <br />
&nbsp; &nbsp; &nbsp; &nbsp; [](const Adherent &amp;ad1,const Adherent &amp;ad2)-&gt;bool{ return ad1.m_nAge &lt; ad2.m_nAge;});</div></div>
<p>L’expression lambda débute avec l’écriture de <strong>“[]”</strong>, la déclaration des paramètres <strong>ad1</strong> et <strong>ad2</strong> fournissent au compilateur les paramètres de la pseudo-fonction anonyme.<br />
Le type de retour de la fonction est précisé par <strong>« ->bool »</strong>, le corps de la fonction est exprimé entre les deux accolades.<br />
Avec les expressions lambda parcourir le tableau et réaliser un traitement <strong>« inline »</strong> devient beaucoup plus facile :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; for_each(vAdherent.begin(),vAdherent.end(), <br />
&nbsp; &nbsp; [](const Adherent &amp;ad) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp;TRACE(&quot;\n %d&quot;,ad.m_nAge); <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );</div></div>
<p>Consultez <a href="http://msdn.microsoft.com/fr-fr/library/dd293603.aspx">MSDN</a> pour plus de renseignements sur les syntaxes possibles. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C++ 2010 / C++ 0X: utilisation du Trailing return type</title>
		<link>https://blog.developpez.com/farscape/p8925/visualcmfc/visual_c_2010_c_0x_utilisation_du_traili</link>
		<comments>https://blog.developpez.com/farscape/p8925/visualcmfc/visual_c_2010_c_0x_utilisation_du_traili#comments</comments>
		<pubDate>Mon, 17 May 2010 05:00:00 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Après avoir abordé decltype dans mon dernier billet, passons au &#171;&#160;Trailing return type&#160;&#187; ou en français la mise en place du type de retour (je n&#8217;ai pas trouvé mieux comme traduction). Cette syntaxe utilisée dans les expressions lambda permet de spécifier le type de retour d’une fonction. Considérons les deux exemples qui suivent : L’expression la plus simple : auto GetLong() -&#62; long { &#160; &#160; return 1L; } J’ai spécifié que le type de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Après avoir abordé <a href="http://blog.developpez.com/farscape/p8906/visualc-mfc/developpement/visual-c-2010-c-0x-utilisation-de-delcty/">decltype</a> dans mon dernier billet, passons au <strong>&laquo;&nbsp;Trailing return type&nbsp;&raquo;</strong> ou en français la mise en place du type de retour (je n&rsquo;ai pas trouvé mieux comme traduction).<br />
<span id="more-21"></span><br />
Cette syntaxe utilisée dans les expressions lambda permet de spécifier le type de retour d’une fonction.<br />
Considérons les deux exemples qui suivent :</p>
<p>L’expression la plus simple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">auto GetLong() -&gt; long <br />
{ <br />
&nbsp; &nbsp; return 1L; <br />
}</div></div>
<p>J’ai spécifié que le type de retour était un long grâce à la syntaxe <strong>-> type</strong><br />
Bien entendu cet exemple comme celui qui va suivre est franchement improbable dans notre codage de tous les jours.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">auto GetFloat() -&gt; decltype(1.0) <br />
{ <br />
&nbsp; &nbsp; return 1.0; <br />
}</div></div>
<p>Cette fois-ci le retour est spécifié par l’évaluation de l’expression contenue dans <strong>decltype</strong>.<br />
Alors franchement à quoi cela peut il servir ?<br />
Cette syntaxe peut avoir son utilité avec l’utilisation des modèles (template).<br />
Par exemple avec cette fonction template que j’écris initialement comme suit :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">template &lt;typename Arg1, typename Arg2&gt; <br />
Arg2 AddItem(Arg1 a1, Arg2 a2) &nbsp;<br />
{ <br />
&nbsp; &nbsp; return a1 + a2; <br />
}</div></div>
<p>Cette fonction se propose d’additionner deux types de données, pour spécifier le retour de ma fonction j’ai spécifié de manière arbitraire le type Arg2 ce qui réduit fortement les possibilités d’utilisation de ma fonction.</p>
<p>Si je reprends mon exemple sur les <a href="http://blog.developpez.com/farscape/p8895/visualc-mfc/visual-c-2010-c-0x-utilisation-des-refer/">rvalues</a> avec la classe <strong>XDate</strong> et que je veuille écrire ce genre de chose :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">XDate d(GetCurrentDay()); &nbsp;<br />
&nbsp;<br />
auto result=AddItem(d, 1);</div></div>
<p>cet exemple ne passera pas à la compilation.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">template &lt;typename Arg1, typename Arg2&gt; <br />
auto AddItem(Arg1 a1, Arg2 a2) -&gt; decltype(a1+a2) <br />
{ <br />
&nbsp; &nbsp; return a1 + a2; <br />
}</div></div>
<p>Celui-ci par contre fonctionne très bien, auto me permet de rester neutre sur le retour qui sera évalué par decltype.<br />
Pour être complet dans mon exemple j’ai du rajouté l’opérateur <strong>+</strong> dans ma classe <strong>XDate</strong> pour que l’exemple compile.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class XDate <br />
{ <br />
//….. <br />
&nbsp; &nbsp;friend XDate operator+(XDate&amp;&amp; left, const int nDayRight); <br />
&nbsp; friend XDate operator+(const XDate&amp; left, const int nDayRight); <br />
//… <br />
}; <br />
XDate operator+(const XDate &amp; left, const int nDayRight) <br />
{ <br />
&nbsp; XDate date; &nbsp;<br />
// … <br />
&nbsp; TRACE(&quot;\nM+:Date:%04X -&gt;(%s)&quot;,date.c_str(),date.c_str()); <br />
&nbsp; // operation de concatenation du jour non implementée... <br />
&nbsp; return date; <br />
}</div></div>
<p>Dans cet exemple on voit la puissance du mécanisme puisque l’expression spécifiée dans <strong>decltype</strong> à permis au compilateur de déterminer le retour puisque l’opérateur <strong>+ de XDate</strong> était disponible.</p>
<p>L’exemple suivant fonctionne aussi sans avertissement de conversion :</p>
<p><code class="codecolorer text default"><span class="text">auto v=AddItem(10.,1);</span></code></p>
<p>J’additionne un <strong>double</strong> et un <strong>entier</strong>.</p>
<p>Pour finir j’ai constaté que dans cet exemple <strong>IntelliSense</strong> ne savait pas trop comment s’en sortir avec cette utilisation.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C++ 2010 / C++ 0X: Utilisation de  delctype</title>
		<link>https://blog.developpez.com/farscape/p8906/visualcmfc/visual_c_2010_c_0x_utilisation_de_delcty</link>
		<comments>https://blog.developpez.com/farscape/p8906/visualcmfc/visual_c_2010_c_0x_utilisation_de_delcty#comments</comments>
		<pubDate>Mon, 10 May 2010 05:00:00 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[decltype permet de déduire le type de donnée d’une expression: int n ; decltype(n) var ; Déclare la variable var comme étant un entier, le compilateur connait le type de donnée n et remplacera l’expression par : int var ; Par rapport à auto que nous avons vu dans le billet précédent, on peut se poser la question de l’intérêt de decltype, en fait celui-ci vient en complément de auto. Considérons le cas suivant : [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>decltype</strong>  permet de déduire le type de donnée d’une expression:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int n ; <br />
decltype(n) var ;</div></div>
<p><span id="more-58"></span><br />
Déclare la variable <strong>var</strong> comme étant un entier, le compilateur connait le type de donnée <strong>n</strong> et remplacera l’expression par : </p>
<p><code class="codecolorer text default"><span class="text">int var ;</span></code></p>
<p>Par rapport à <a href="http://blog.developpez.com/farscape/p8903/visualc-mfc/developpement/visual-c-2010-c-0x-utilisation-du-mot-cl/">auto</a> que nous avons vu dans le billet précédent, on peut se poser la question de l’intérêt de <strong>decltype</strong>, en fait celui-ci vient en complément de <strong>auto</strong>.<br />
Considérons le cas suivant :</p>
<p><code class="codecolorer text default"><span class="text">auto d=func() ;</span></code></p>
<p>Je viens de déclarer une variable <strong>d</strong> en accord avec le retour de <strong>func()</strong> .<br />
Maintenant si je veux déclarer une autre variable du même type que <strong>d</strong>, je ne veux pas ou ne peut pas forcement appeler la même fonction pour déclarer ma variable.<br />
Dans ce cas l’utilisation de <strong>delctype</strong> résout le problème :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">auto d=func() ; <br />
delctype(d) dd ;</div></div>
<p>Je peux aussi écrire :</p>
<p><code class="codecolorer text default"><span class="text">decltype(func()) dd ;</span></code></p>
<p>Car à la différence de <strong>auto</strong> <strong>decltype n’exécute pas l’expression</strong> il analyse le type de donnée de l’expression.<br />
Comme précédemment  avec <strong>auto</strong>, <strong>IntelliSense</strong> est capable de nous donner l’information sur le type de donnée de la variable  ainsi déclarée.</p>
<p>Référence <a href="http://msdn.microsoft.com/en-us/library/dd537655.aspx">MSDN</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C++ 2010 / C++ 0X: Utilisation des références R-Value</title>
		<link>https://blog.developpez.com/farscape/p8895/visualcmfc/visual_c_2010_c_0x_utilisation_des_refer</link>
		<comments>https://blog.developpez.com/farscape/p8895/visualcmfc/visual_c_2010_c_0x_utilisation_des_refer#comments</comments>
		<pubDate>Mon, 03 May 2010 05:00:00 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Après avoir abordé static_assert dans mon dernier billet, passons à la référence R-Value. Pour bien comprendre ce qui va suivre il est impératif de connaitre les méthodes de transmission d’un argument dans une méthode en l’occurrence le passage par valeur et par référence. Dans la littérature C++, rValue désigne un objet pouvant figurer à droite (right) d’une affectation, alors que lValue désigne un objet pouvant se trouver à gauche. Concrètement une nouvelle forme de déclaration [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Après avoir abordé <a href="http://blog.developpez.com/farscape/p8882/visualc-mfc/developpement/visual-c-2010-c-0x-utilisation-de-static/">static_assert</a> dans mon dernier billet, passons à la référence <strong>R-Value</strong>.</p>
<p>Pour bien comprendre ce qui va suivre il est impératif de connaitre les méthodes de transmission d’un argument dans une méthode en l’occurrence le passage par valeur  et par référence.</p>
<p>Dans la littérature C++, <strong>rValue</strong> désigne un objet pouvant figurer à droite (right) d’une affectation, alors  que <strong>lValue</strong> désigne un objet pouvant se trouver à gauche.<br />
Concrètement une nouvelle forme de déclaration  utilisant l&rsquo;opérateur <strong>&amp;&amp;</strong> va nous permettre de transférer la responsabilité d’une ressource d’un objet temporaire à un autre, évitant ainsi une libération mémoire et une nouvelle allocation et la copie de la ressource concernée.<br />
<span id="more-20"></span><br />
Voici une petite classe d’exemple qui illustre le sujet :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class XDate <br />
{ <br />
public: <br />
&nbsp; XDate():m_szDate(nullptr){} <br />
&nbsp; ~XDate() {delete [] m_szDate;} <br />
&nbsp;<br />
&nbsp; XDate(const char *szDate):m_szDate(nullptr) <br />
&nbsp; { <br />
&nbsp; &nbsp; SetDate(szDate); <br />
&nbsp; } <br />
&nbsp; XDate(const XDate &amp;date):m_szDate(nullptr) <br />
&nbsp; { <br />
&nbsp; &nbsp; SetDate(date.m_szDate); <br />
&nbsp; } <br />
&nbsp; void SetDate(const char *szDate) <br />
&nbsp; { <br />
&nbsp; &nbsp; if(m_szDate==nullptr) m_szDate= new char [7]; <br />
&nbsp; &nbsp; strcpy_s(m_szDate,7,szDate); <br />
&nbsp; } <br />
&nbsp; const XDate&amp; operator=(const XDate&amp; Src) <br />
&nbsp; { <br />
&nbsp; &nbsp; if(&amp;Src==this) return *this; <br />
&nbsp; &nbsp; SetDate(Src.m_szDate); <br />
&nbsp; &nbsp; return *this; <br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; const char *c_str(){return m_szDate;} <br />
&nbsp;<br />
&nbsp; void DebugTrace() <br />
&nbsp; { <br />
&nbsp; &nbsp; TRACE(&quot;\nDate:%04X -&gt;(%s)&quot;,m_szDate,m_szDate==nullptr?&quot;&quot;:m_szDate); <br />
&nbsp; } <br />
public: <br />
&nbsp; char *m_szDate; <br />
}; <br />
&nbsp;<br />
XDate GetCurrentDay() <br />
{ <br />
&nbsp; &nbsp; return XDate(&quot;030510&quot;); <br />
} <br />
&nbsp;<br />
void SetDate(const XDate&amp; date) <br />
{ <br />
&nbsp; XDate d(date); <br />
&nbsp;<br />
&nbsp; d.DebugTrace(); <br />
} <br />
&nbsp;<br />
&nbsp;<br />
int main() <br />
{ <br />
&nbsp; &nbsp; SetDate( GetCurrentDay()); <br />
}</div></div>
<p><strong><br />
XDate</strong>  alloue en mémoire une chaine de caractère pour tenir une date.<br />
Dans l’appel réalisé dans le main on retrouve bien la séquence décrite précédemment ou un objet temporaire fournit par <strong>GetCurrentDay()</strong>  sert  affecter un objet de la même classe dans la méthode <strong>SetDate</strong>.<br />
Le nouvel opérateur <strong>&#038;&#038;</strong> va nous permettre de faire l’économie d’une libération, allocation et d’un transfert mémoire :<br />
Je vais modifier pour  l’exemple la fonction <strong>SetDate</strong> comme suit :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">void SetDate(XDate&amp;&amp; date) <br />
{ <br />
&nbsp; XDate d; <br />
&nbsp; d.m_szDate=date.m_szDate; <br />
&nbsp; date.m_szDate=nullptr; <br />
&nbsp;<br />
&nbsp; d.DebugTrace(); <br />
}</div></div>
<p>Dans <strong>SetDate</strong> je récupère directement l&rsquo;adresse contenue par le pointeur de l’objet temporaire et je positionne à <strong>nullptr</strong> celui de l’objet temporaire.<br />
La méthode <strong>SetDate</strong> modifiée a été appelée parce que nous bien en présence d’un objet temporaire fournit par <strong>GetCurrentDay()</strong>.<br />
Si je modifie comme suit la fonction <strong>main()</strong> :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int main() <br />
{ <br />
&nbsp; &nbsp;XDate d(&quot;030510&quot;); <br />
&nbsp; &nbsp;SetDate(d); <br />
}</div></div>
<p><strong>J’obtiens l’erreur:</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">error C2664: 'SetDate' : cannot convert parameter 1 from 'XDate' to 'XDate &amp;&amp;' <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; You cannot bind an lvalue to an rvalue reference</div></div>
<p><strong>Note:</strong>  IntelliSense m’avait déjà prévenu de l’erreur avant la compilation …<br />
Si on veut avoir un code opérationnel dans les deux cas, il faudra laisser l’autre méthode <strong>SetDate</strong> active :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">void SetDate(const XDate&amp; date) <br />
{ <br />
&nbsp; &nbsp;XDate d(date); <br />
&nbsp;<br />
&nbsp; &nbsp;d.DebugTrace(); <br />
} <br />
void SetDate(XDate&amp;&amp; date) <br />
{ <br />
&nbsp; &nbsp; &nbsp;XDate d; <br />
&nbsp; &nbsp; &nbsp;d.m_szDate=date.m_szDate; <br />
&nbsp; &nbsp; &nbsp;date.m_szDate=nullptr; <br />
&nbsp; &nbsp; &nbsp;d.DebugTrace(); <br />
}</div></div>
<p>Si on veut forcer la main au compilateur pour utiliser la méthode avec la déclaration <strong>rValue</strong> on pourra utiliser un <strong>static_cast</strong> :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int main() <br />
{ <br />
&nbsp; &nbsp;XDate d(&quot;030510&quot;); <br />
&nbsp; &nbsp;SetDate(static_cast&lt;XDate &amp;&amp;&gt;(d)); <br />
&nbsp; &nbsp;d.DebugTrace(); <br />
&nbsp;<br />
}</div></div>
<p>Autre exemple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int main() &nbsp;<br />
{ &nbsp;<br />
&nbsp; XDate d(&quot;030510&quot;); &nbsp;<br />
&nbsp; SetDate(d); &nbsp;<br />
&nbsp; SetDate(XDate(&quot;030510&quot;)); <br />
}</div></div>
<p>le premier SetDate reçoit une variable locale (lValue) et donc appellera la version const de SetDate.<br />
le deuxiéme appel est réalisé avec un objet temporaire car référencé nul part dans le programme, c&rsquo;est donc bien un rValue qui appellera la version XDate &#038;&#038; de SetDate.</p>
<p>Bien, maintenant que nous avons compris comment tirer parti de cette fonctionnalité, il reste à implémenter ce mécanisme directement dans notre classe en ajoutant un constructeur de déplacement  (Move constructor ) et l’opérateur d’affectation (Move assignement)  ainsi qu’un opérateur +.<br />
La classe finale :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class XDate <br />
{ <br />
public: <br />
&nbsp; XDate():m_szDate(nullptr){} <br />
&nbsp; ~XDate() {delete [] m_szDate;} <br />
&nbsp;<br />
&nbsp; XDate(const char *szDate):m_szDate(nullptr) <br />
&nbsp; { <br />
&nbsp; &nbsp; SetDate(szDate); <br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; XDate(XDate &amp;&amp;date):m_szDate(nullptr) <br />
&nbsp; { <br />
&nbsp; &nbsp; Move(date); &nbsp; &nbsp;<br />
&nbsp; &nbsp; TRACE(&quot;\nMC:Date:%04X -&gt;(%s)&quot;,m_szDate,m_szDate==nullptr?&quot;&quot;:m_szDate); <br />
&nbsp; } <br />
&nbsp; <br />
&nbsp; XDate(const XDate &amp;date):m_szDate(nullptr) <br />
&nbsp; { <br />
&nbsp; &nbsp; SetDate(date.m_szDate); <br />
&nbsp; } <br />
&nbsp; <br />
&nbsp; void SetDate(const char *szDate) <br />
&nbsp; { <br />
&nbsp; &nbsp; if(m_szDate==nullptr) &nbsp;m_szDate= new char [7]; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; strcpy_s(m_szDate,7,szDate); <br />
&nbsp; &nbsp; DebugTrace(); <br />
&nbsp; } <br />
&nbsp; XDate&amp; operator=(XDate&amp;&amp; Src) <br />
&nbsp; { <br />
&nbsp; &nbsp; if(&amp;Src==this) return *this; <br />
&nbsp; &nbsp; Move(Src); <br />
&nbsp; &nbsp; TRACE(&quot;\nMA:Date:%04X -&gt;(%s)&quot;,m_szDate,m_szDate==nullptr?&quot;&quot;:m_szDate); <br />
&nbsp; &nbsp; return *this; <br />
&nbsp; } <br />
&nbsp; <br />
&nbsp; &nbsp; friend XDate operator+(XDate&amp;&amp; left, const int nDayRight); <br />
&nbsp;<br />
&nbsp; const XDate&amp; operator=(const XDate&amp; Src) <br />
&nbsp; { <br />
&nbsp; &nbsp; if(&amp;Src==this) return *this; <br />
&nbsp; &nbsp; SetDate(Src.m_szDate); <br />
&nbsp; &nbsp; return *this; <br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; const char *c_str(){return m_szDate;} <br />
&nbsp;<br />
&nbsp; void Move(XDate &amp;date) <br />
&nbsp; { <br />
&nbsp; &nbsp; m_szDate=date.m_szDate; <br />
&nbsp; &nbsp; date.m_szDate=nullptr; &nbsp;<br />
&nbsp; } <br />
&nbsp; void DebugTrace() <br />
&nbsp; { <br />
&nbsp; &nbsp; TRACE(&quot;\nDate:%04X -&gt;(%s)&quot;,m_szDate,m_szDate==nullptr?&quot;&quot;:m_szDate); <br />
&nbsp; } <br />
public: <br />
&nbsp; char *m_szDate; <br />
}; <br />
&nbsp;<br />
XDate operator+(XDate &amp;&amp; left, const int nDayRight) <br />
{ <br />
&nbsp; &nbsp; XDate date; <br />
&nbsp; &nbsp; date.Move(left); <br />
&nbsp; &nbsp; TRACE(&quot;\nM+:Date:%04X -&gt;(%s)&quot;,date.c_str(),date.c_str()); <br />
&nbsp; &nbsp; // operation d’ajout du jour non implementée... <br />
&nbsp; &nbsp; return date; <br />
}</div></div>
<p><strong>Et l’utilisation :</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">XDate d(GetCurrentDay()); <br />
d= GetCurrentDay()+1; <br />
d.DebugTrace();</div></div>
<p>la première ligne utilise le constructeur de copie normal et pas le constructeur de déplacement comme on pourrait s’y attendre (ce qui ressemble bien à un bug (?)).<br />
La seconde ligne va utiliser successivement l’opérateur <strong>+</strong>, le constructeur  de déplacement et enfin l’opérateur d’affectation de déplacement.</p>
<p>Voila pour ce billet un peu long qui j’espère vous a éclairé sur l’utilisation de la référence <strong>R-Value</strong>.<br />
Référence <a href="http://msdn.microsoft.com/en-us/library/dd293668.aspx">MSDN</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C++ 2010 / C++ 0X: Utilisation du mot clef auto</title>
		<link>https://blog.developpez.com/farscape/p8903/visualcmfc/visual_c_2010_c_0x_utilisation_du_mot_cl</link>
		<comments>https://blog.developpez.com/farscape/p8903/visualcmfc/visual_c_2010_c_0x_utilisation_du_mot_cl#comments</comments>
		<pubDate>Fri, 07 May 2010 05:00:00 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Après avoir abordé la référence r-Value dans mon dernier billet, passons au mot-clef auto. auto permet de déclarer une variable sans spécifier son type de donnée. Un exemple très simple : auto myvar= 1 ; La ligne ci-dessus déclare un variable sans préciser son type. Celui-ci est déterminé par le compilateur en examinant la partie droite de l’expression. Le code est alors transformé en : int myvar= 1 ; Donc s’il n’y a pas d’affectation [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Après avoir abordé la <a href="http://blog.developpez.com/farscape/p8895/visualc-mfc/visual-c-2010-c-0x-utilisation-des-refer/">référence r-Value</a> dans mon dernier billet, passons au mot-clef <strong>auto</strong>.</p>
<p><strong>auto</strong> permet de déclarer une variable sans spécifier son type de donnée.<br />
Un exemple très simple :</p>
<p><code class="codecolorer text default"><span class="text">auto myvar= 1 ;</span></code></p>
<p>La ligne ci-dessus déclare un variable sans préciser son type.<br />
Celui-ci est déterminé par le compilateur en examinant la partie droite de l’expression.<br />
Le code est alors transformé en :<br />
<span id="more-57"></span><br />
<code class="codecolorer text default"><span class="text">int myvar= 1 ;</span></code></p>
<p>Donc s’il n’y a pas d’affectation le compilateur ne peut pas déterminer le type et retournera donc une erreur.<br />
Le point important qu’il faut retenir c’est que le type de donnée est déterminé à la compilation et non à l’exécution du code.<br />
Dans mon article sur <a href="http://farscape.developpez.com/Articles/VisualStudio2010/">Visual studio 2010</a> j’avais évoqué les améliorations d’IntelliSense, dans le contexte présent celui-ci nous fournit directement le type de donnée qui sera associée à la variable, il suffit de survoler la souris sur le nom de la variable.</p>
<p>On pourra donc déclarer toutes sortes de variable : des pointeurs, des tableaux de pointeur  des constantes, tout cela est possible à partir du moment ou le compilateur peut déterminer le type associé dans la déclaration.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">auto dArray= new double[5] ; // tableau de double * <br />
auto pMyVar=&amp;myvar ; // un pointeur sur myvar. <br />
const auto nMax=100 ; &nbsp;// une constante.</div></div>
<p>Etc ..<br />
Ce qui ne peut est géré :<br />
L’utilisation d’<strong>auto</strong> pour le retour d’une fonction :</p>
<p><code class="codecolorer text default"><span class="text">auto getval();</span></code></p>
<p>L’utilisation d’<strong>auto</strong> pour l’argument d’une fonction<br />
<code class="codecolorer text default"><span class="text">int getval(auto n) ;</span></code></p>
<p>La déclaration d’une variable avec <strong>auto</strong> dans la déclaration d’une classe ou d’une structure.<br />
Les déclarations multiples sur une ligne qui donnent lieu à des types différents :</p>
<p><code class="codecolorer text default"><span class="text">auto n=1,d=1.0 ,l=1L ;</span></code></p>
<p>Après ce tour d’horizon des fonctionnalités basiques de ce mot clef, examinons maintenant ce pour quoi il va être vraiment utile.<br />
Vous avez certainement tous utilisé  les conteneurs de la STL (j’espère !) , en voici un exemple tiré de mes codes :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">// dans le .h de ma classe : <br />
std::vector&lt;CItem&gt; m_Items; <br />
// dans mon code: <br />
&nbsp;<br />
std::vector&lt;CItem&gt;::iterator it; <br />
&nbsp;<br />
for(it=m_Items.begin();it!=m_Items.end();++it) <br />
&nbsp; if(it-&gt;m_nID==nID) <br />
&nbsp; &nbsp; return (it-&gt;m_dwFlags &amp; itemChecked)!=0;</div></div>
<p><strong>auto</strong> va me permettre de me libérer de la syntaxe lourde de l’itérateur (qui est ici très simple):</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">for(auto it=m_Items.begin();it!=m_Items.end();++it) <br />
&nbsp; if(it-&gt;m_nID==nID) <br />
&nbsp; &nbsp; return (it-&gt;m_dwFlags &amp; itemChecked)!=0;</div></div>
<p>C’est plus agréable à écrire non ?<br />
Si j’ai besoin d’un <strong>const_iterator</strong> , la classe vector y pourvoit :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">for(auto it=m_Items.cbegin();it!=m_Items.cend();++it) <br />
&nbsp; if(it-&gt;m_nID==nID) <br />
&nbsp; &nbsp; return (it-&gt;m_dwFlags &amp; itemChecked)!=0;</div></div>
<p>le couple <strong>begin()</strong> <strong>end()</strong> laisse la place à <strong>cbegin()</strong> <strong>cend()</strong>.<br />
Mon exemple était volontairement simple, mais je pense que tout le monde appréciera la simplicité retrouvée pour déclarer un itérateur sur un objet conteneur.</p>
<p>Référence <a href="http://msdn.microsoft.com/en-us/library/dd293667.aspx">MSDN</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C++ 2010 / C++ 0X : utilisation de nullptr</title>
		<link>https://blog.developpez.com/farscape/p8879/visualcmfc/visual_c_c_0x_utilisation_de_nullptr</link>
		<comments>https://blog.developpez.com/farscape/p8879/visualcmfc/visual_c_c_0x_utilisation_de_nullptr#comments</comments>
		<pubDate>Wed, 28 Apr 2010 05:00:00 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans mon billet précédent je présentais mon article sur les nouveautés de Visual C++ avec notamment un point sur le support partiel de C++0x. Je vous propose de découvrir quelques-unes de ces nouvelles fonctionnalités en commençant par : nullptr. Nullptr, littéralement : pointeur nul, devient un mot clef du langage à part entière, il est destiné à remplacer dans votre code NULL qui est une définition: &#160;#define NULL &#160; &#160;0 Nous pouvons maintenant écrire : [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans mon billet précédent je présentais  mon article sur <a href="http://farscape.developpez.com/Articles/VisualStudio2010/">les nouveautés de Visual C++</a> avec notamment un point sur le support partiel de <strong>C++0x</strong>.<br />
Je vous propose de découvrir quelques-unes de  ces nouvelles fonctionnalités en commençant par : <strong>nullptr.</strong></p>
<p><strong>Nullptr</strong>, littéralement : pointeur nul,  devient un mot clef du langage à part entière, il est destiné à remplacer dans votre code NULL qui est une définition:</p>
<p><code class="codecolorer text default"><span class="text">&nbsp;#define NULL &nbsp; &nbsp;0</span></code></p>
<p>Nous pouvons maintenant écrire :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CData* pData= nullptr; <br />
if ( pData == nullptr ){} <br />
&nbsp;<br />
BOOL CMainFrame::CreateOutlookBar(…) <br />
{ <br />
If(this==nullptr || m_hWnd== nullptr) return FALSE; <br />
}</div></div>
<p>Jusqu&rsquo;à présent  rien de bien essentiel  par rapport à l’utilisation de <strong>NULL</strong>.<br />
En fait ce mot clef va s’avérer utile dans le cas suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">… <br />
void MyClass ::FunctionAdd(int &nbsp;*pInt){... <br />
void MyClass ::FunctionAdd(int n){... <br />
… <br />
MyClass &nbsp;var; <br />
var.FunctionAdd(nullptr); // &nbsp;Appellera FunctionAdd(int &nbsp;*pInt); <br />
var.FunctionAdd(NULL); &nbsp; // &nbsp;Appellera &nbsp;FunctionAdd(int n); sans avertissement du compilateur...</div></div>
<p><strong>nullptr</strong> permet ici d’éviter la mauvaise résolution d’appel de la méthode suggérée par <strong>NULL</strong> qui est un entier.</p>
<p><strong>Dernier point :</strong> Je n’ai pas fait l’essai, mais il serait intéressant de voir si <strong>nullptr</strong> peut être utilisé dans du code mixte <strong>C++</strong> et <strong>C++CLI</strong> qui utilise aussi ce mot clef…</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C++ 2010 / C++ 0X: utilisation de static_assert</title>
		<link>https://blog.developpez.com/farscape/p8882/visualcmfc/visual_c_2010_c_0x_utilisation_de_static</link>
		<comments>https://blog.developpez.com/farscape/p8882/visualcmfc/visual_c_2010_c_0x_utilisation_de_static#comments</comments>
		<pubDate>Thu, 29 Apr 2010 05:00:00 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Après avoir abordé nullptr dans mon dernier billet, passons à static_assert. static_assert permet de vérifier une condition au moment de la compilation. Sa syntaxe est la suivante : static_assert( expression, message) Exemple : static_assert( 0==1, &#34;zero n’est pas egal a 1 !&#34;) ; si la condition est vérifiée le compilateur ne dit rien, par contre en cas d’erreur comme dans l’exemple ci-dessus il génère une erreur C2338 avec le message mentionné : error C2338: zero [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Après avoir abordé <a href="http://blog.developpez.com/farscape/p8879/visualc-mfc/visual-c-c-0x-utilisation-de-nullptr/">nullptr</a> dans mon dernier billet, passons à <strong>static_assert</strong>.</p>
<p><strong>static_assert</strong> permet de vérifier une condition au moment de la compilation.<br />
Sa syntaxe est la suivante :</p>
<p><code class="codecolorer text default"><span class="text">static_assert( expression, message)</span></code></p>
<p><strong>Exemple :</strong></p>
<p><code class="codecolorer text default"><span class="text">static_assert( 0==1, &quot;zero n’est pas egal a 1 !&quot;) ;</span></code></p>
<p>si la condition est vérifiée le compilateur ne dit rien, par contre en cas d’erreur comme dans l’exemple ci-dessus il génère une erreur <strong>C2338</strong> avec le message mentionné :<br />
<strong>error C2338: zero n’est pas egal a 1 !</strong></p>
<p>Le message ne supporte que les caractères de base et donc pas les accents.<br />
Dans le cas d’utilisation de <strong>static_assert</strong> avec une classe <strong>template</strong>, la condition sera vérifiée lorsque une classe utilisant le <strong>template</strong> sera déclarée.</p>
<p>Référence <a href="http://msdn.microsoft.com/en-us/library/dd293588.aspx">MSDN</a> </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual C++ 2010 premières impressions</title>
		<link>https://blog.developpez.com/farscape/p8876/visualcmfc/visual_c_2010_premieres_impressions</link>
		<comments>https://blog.developpez.com/farscape/p8876/visualcmfc/visual_c_2010_premieres_impressions#comments</comments>
		<pubDate>Tue, 27 Apr 2010 07:37:50 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Annonces]]></category>
		<category><![CDATA[Critiques]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans mon précédent billet j’annonçais la sortie de Visual Studio 2010 et les principales raisons de s’y intéresser. Je reviens sur le sujet avec un article de présentation disponible ici.]]></description>
				<content:encoded><![CDATA[<p>Dans mon précédent billet j’annonçais la sortie de Visual Studio 2010 et les principales raisons de s’y intéresser.<br />
Je reviens sur le sujet avec un article de présentation disponible <a href="http://farscape.developpez.com/Articles/VisualStudio2010/">ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual studio 2010 est disponible</title>
		<link>https://blog.developpez.com/farscape/p8817/visualcmfc/visual_studio_2010_est_disponible</link>
		<comments>https://blog.developpez.com/farscape/p8817/visualcmfc/visual_studio_2010_est_disponible#comments</comments>
		<pubDate>Wed, 14 Apr 2010 07:56:04 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Annonces]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour un développeur C++ voici quelques raisons pour s’y intéresser 1) Meilleur performance sur des projets volumineux : L’IntelliSense le compagnon indispensable du développeur s’appuie maintenant sur un mini base SQL et réduit notablement le temps de construction de la base de référence. On dispose maintenant d’un soulignement des erreurs de syntaxe. 2) Support de Windows 7 dans les MFC Le ruban (ribbon) peut être construit directement dans l’éditeur de ressources support du redémarrage de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Pour un développeur C++ voici quelques raisons pour s’y intéresser </p>
<p>1) Meilleur performance sur des projets volumineux :</p>
<p>L’IntelliSense le compagnon indispensable du développeur s’appuie maintenant sur un mini base SQL et réduit notablement le temps de construction de la base de référence.<br />
On dispose maintenant d’un soulignement des erreurs de syntaxe.
</p>
<p>2) Support de Windows 7 dans les MFC</p>
<p>Le ruban (ribbon) peut être construit directement dans l’éditeur de ressources<br />
   support du redémarrage de l’application après un crash<br />
   le support du « higth DPI »<br />
   la prévisualisation des documents associés à l’application dans l’explorateur, ainsi que la vue simplifiée.<br />
   La possibilité de ces documents d’être intégrés dans le système de recherche.<br />
   Le support du multi-touch<br />
   le retour de classwizard.</p>
<p>3) nouvelle bibliothèque sur le parallélisme : (parallel Patterns library)</p>
<p>4) support amélioré sur les principales fonctionnalités que propose le C++0X.</p>
<p>Je reviendrai bientôt dans un article (presque finit !) sur ces différents thèmes.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual studio 2010: la RC est disponible !</title>
		<link>https://blog.developpez.com/farscape/p8619/visualcmfc/visual_studio_2010_la_rc_est_disponible_1</link>
		<comments>https://blog.developpez.com/farscape/p8619/visualcmfc/visual_studio_2010_la_rc_est_disponible_1#comments</comments>
		<pubDate>Thu, 11 Feb 2010 07:27:39 +0000</pubDate>
		<dc:creator><![CDATA[farscape]]></dc:creator>
				<category><![CDATA[Annonces]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[VisualC++/MFC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Après avoir passé trois jours aux Techdays pour assister aux conférences en rapport à Visual Studio 2010 et le C++, et être présent sur le stand de développez, il était chuchoté que la RC de Visual studio 2010 allait être annoncé d’ici peu. Hé bien c’est chose faite elle est disponible sur le site Us sur ce lien. A ce sujet Eric Vernié avec qui j’ai discuté hier de cette RC me signalait qu’il avait [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Après avoir passé trois jours aux Techdays pour assister aux conférences en rapport à Visual Studio 2010 et le C++, et être présent sur le stand de développez, il était chuchoté que la RC de Visual studio 2010 allait être annoncé d’ici peu.<br />
Hé bien c’est chose faite elle est disponible sur le site Us sur <a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx">ce lien</a>.<br />
A ce sujet Eric Vernié avec qui j’ai discuté hier de cette RC me signalait qu’il avait un bug avec IntelliSense et l’utilisation du multi-touch  mais qu’il y avait un patch en cours de diffusion&#8230;<br />
Bon je vous laisse j’ai un téléchargement à lancer. <img src="https://blog.developpez.com/farscape/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
