<?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>Scio Me Nihil Scire &#187; C++</title>
	<atom:link href="https://blog.developpez.com/timothee-bernard/pcategory/c/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/timothee-bernard</link>
	<description></description>
	<lastBuildDate>Fri, 12 Oct 2012 08:40:15 +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>DSEL et C++: définition et illustration avec std::initializer_list</title>
		<link>https://blog.developpez.com/timothee-bernard/p11428/c/dsel-et-c-definition-et-illustration-avec-stdinitializer_list</link>
		<comments>https://blog.developpez.com/timothee-bernard/p11428/c/dsel-et-c-definition-et-illustration-avec-stdinitializer_list#comments</comments>
		<pubDate>Fri, 12 Oct 2012 08:37:05 +0000</pubDate>
		<dc:creator><![CDATA[mitkl]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[DSEL]]></category>
		<category><![CDATA[Proto]]></category>
		<category><![CDATA[STL]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/timothee-bernard/?p=10</guid>
		<description><![CDATA[&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Cet article est un miroir de l&#8217;article présent sur mon blog : DSEL et C++: Définition et illustration avec std::initializer_list &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Au cours du mois dernier, j&#8217;ai eu la chance de pouvoir traduire le premier article d&#8217;une longue série &#8230; <a href="https://blog.developpez.com/timothee-bernard/p11428/c/dsel-et-c-definition-et-illustration-avec-stdinitializer_list">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
<a href="http://timothee-bernard.fr/dsel-et-cpp-ensemble-avec-initializer-list-et-surcharge-d-operateur.html"><strong>Cet article est un miroir de l&rsquo;article présent sur mon blog : DSEL et C++: Définition et illustration avec std::initializer_list</strong></a><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p><p>Au cours du mois dernier, j&rsquo;ai eu la chance de pouvoir traduire le premier article d&rsquo;une longue série consacrée aux <strong>Domain-Specific Embedded Languages (DSEL)</strong> en C++ sur un site qui me tient beaucoup à coeur : <a href="http://developpez.com">Developpez.com</a>. La série de base a été publiée il y a un plus de deux ans par Eric Niebler sur le blog <a href="http://cpp-next.com">C++Next</a>. Et au début de ce mois, j&rsquo;ai été ravi de voir ma petite contribution publiée à cette adresse : <a href="http://cpp.developpez.com/redaction/data/pages/rubrique/cpp/boost/proto/proto1/">Le C++ expressif n°1 : Introduction</a>, premier article de la série <a href="http://cpp.developpez.com/redaction/data/pages/rubrique/cpp/boost/proto/index/">C++ expressif avec Boost.Proto</a>.</p>
<p>Cet évènement est alors l&rsquo;occasion pour moi de vous parler des <strong>DSEL</strong> car c&rsquo;est un sujet qui mérite l&rsquo;attention et parce que je souhaite vraiment que de nouveaux DSEL se développent. Dans la deuxième partie de cet article, nous construirons notre <strong>propre petit DSEL</strong> pour s&rsquo;assurer d&rsquo;avoir bien saisi le concept.</p>
<h1 id="domain-specific-embedded-language">« Domain-Specific Embedded Language »</h1>
<p>Avoir traduit l&rsquo;article est une opportunité pour moi d&rsquo;exprimer avec mes propres mots et mes propres questions sur: qu&rsquo;est-ce qu&rsquo;un DSEL ? Je n&rsquo;ai rien contre l&rsquo;article d&rsquo;origine, au contraire sinon je ne l&rsquo;aurai pas traduit, mais celui-ci est long et déjà destiné à un public averti. Je souhaiterai juste, à travers cette partie, reformuler et synthétiser ce concept.</p>
<p>Concrètement, comment faut-il comprendre cette expression ?</p>
<ul>
<li><strong>Domain-Specific</strong> : c&rsquo;est spécialisé dans un domaine.</li>
<li><strong>Embedded</strong> : c&rsquo;est <em>intégré</em>, il n&rsquo;y a aucun rapport avec l&rsquo;<a href="http://en.wikipedia.org/wiki/Embedded_system">Embedded</a> en informatique.</li>
<li><strong>Language</strong> : c&rsquo;est un langage informatique.</li>
</ul>
<p>Un DSEL c&rsquo;est donc un <strong>petit langage</strong> intégré à l&rsquo;intérieur même d&rsquo;un <strong>langage hôte</strong> et on va utiliser ce petit langage car sa syntaxe est adaptée à un domaine en particulier.</p>
<p>Il ne faut absolument pas le confondre avec un <strong>Domain-Specific Language</strong>, un exemple de DSL que vous connaissez sûrement est le langage <strong>SQL</strong>, c&rsquo;est un langage à part entière, il n&rsquo;est pas intégré dans un langage hôte et il est spécialisé pour travailler avec les bases de données.</p>
<p>Le point le plus important à propos d&rsquo;un <strong>DSEL</strong> c&rsquo;est que pour en créer un, on n&rsquo;utilise <strong>QUE</strong> les spécificités et la syntaxe d&rsquo;un langage de base. Autrement dit, notre petit langage intégré <strong>DOIT</strong> pouvoir être compilé par le compilateur du langage sans aucune autre extension dans le processus.</p>
<p>Mais alors, comment fait-on pour créer un langage si on ne peut pas modifier un peu sa syntaxe ? Tout simplement grâce à deux concepts très puissants du C++ : <strong>la métaprogrammation avec des templates</strong> et <strong>la surcharge d&rsquo;opérateur</strong>.</p>
<p>Bien sûr comme toute chose en matière de programmation, il y a toujours des développeurs pour pousser la conception au plus haut niveau afin de permettre à l&rsquo;utilisateur de ne se soucier que de son problème. Et cela existe aussi pour la conception de DSEL avec notamment Boost.Proto mais cela je vous laisse le découvrir à travers la série : <a href="http://cpp.developpez.com/redaction/data/pages/rubrique/cpp/boost/proto/index/">C++ expressif avec Boost.Proto</a>. <img src="https://blog.developpez.com/timothee-bernard/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Pourquoi utiliser un DSEL ?</p>
<p>Pour rendre le code plus lisible quand on traite un domaine en particulier évidemment ! Nous allons voir ça tout de suite avec un exemple.</p>
<h1 id="cas-pratique-notre-propre-dsel">Cas pratique : notre propre DSEL</h1>
<p>Trêve de bavardage, l&rsquo;aspect théorique est terminé, on va enfin pouvoir s&rsquo;amuser !</p>
<p>Afin de créer notre propre petit DSEL, on va s&rsquo;imaginer une problématique. On souhaiterait travailler avec des ensembles en mathématiques. Tout ce qu&rsquo;on souhaite pour les besoins de ce billet, c&rsquo;est de <strong>créer notre ensemble</strong> et de pouvoir <strong>faire l&rsquo;union d&rsquo;ensembles</strong> comme si on faisait des maths ! Malheureusement la syntaxe C++ n&rsquo;est pas ce qu&rsquo;il y a de plus adaptée.</p>
<p>Pour créer notre manipulation d&rsquo;ensemble, on va utiliser trois points clés :</p>
<ul>
<li><strong>std::initializer_list</strong></li>
<li><strong>la surcharge d&rsquo;opérateur</strong></li>
<li><strong>un petit define</strong></li>
</ul>
<p>A la toute fin de ce billet, notre DSEL ressemblera à ça :</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(int argc, char* argv[])<br />
{<br />
&nbsp; Ensemble E1 {42, 1337};<br />
<br />
&nbsp; Ensemble E2 = Ensemble {1, 3, 5} &nbsp; U &nbsp; &nbsp;Ensemble {2, 4, 6};<br />
&nbsp; &nbsp; <br />
&nbsp; Ensemble Final = E1 &nbsp; U &nbsp; E2;<br />
&nbsp; &nbsp; <br />
&nbsp; return 0;<br />
}</div></div>
<p>C&rsquo;est plutôt pas mal non ? <img src="https://blog.developpez.com/timothee-bernard/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<h2 id="un-peu-de-c11">Un peu de C++11</h2>
<p>On va faire un premier jet et on va voir comment on peut améliorer ça. On ne va pas non plus réinventer la roue et on va directement utiliser <strong>std::set</strong>. Pour rappel, ce <em>container</em> assure que chaque élément est <strong>unique</strong> et il <strong>trie automatiquement</strong> de façon croissante.</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">#include <br />
#include <br />
<br />
int main(int argc, char* argv[])<br />
{<br />
&nbsp; std::set set;<br />
&nbsp; set.insert(1);<br />
&nbsp; set.insert(2);<br />
&nbsp; set.insert(3);<br />
&nbsp; set.insert(4);<br />
&nbsp; set.insert(5);<br />
&nbsp; set.insert(6);<br />
&nbsp; &nbsp; <br />
&nbsp; return 0;<br />
}</div></div>
<p>Bon c&rsquo;est pas terrible mais la bonne nouvelle c&rsquo;est qu&rsquo;on peut améliorer ça facilement ! On va l&rsquo;améliorer grâce à une nouveauté de la nouvelle norme <strong>C+11</strong> : <strong>les listes d&rsquo;initialiseurs</strong> et <strong>l&rsquo;initialisation uniforme</strong>. <strong>Attention</strong> : vérifiez que votre compilateur est à jour (g++ 4.7 dans mon cas) pour pouvoir compiler les prochains codes de ce billet et n&rsquo;oubliez pas l&rsquo;argument <strong>-std=c++11</strong>.</p>
<p><strong>Attention</strong> : il ne faut pas confondre la liste d&rsquo;initialiseurs <strong>{1, 2, 3}</strong> et la liste d&rsquo;initialisations d&rsquo;un constructeur <em>MaClasse() : _membre1(0), _membre2(12)</em>.</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">#include <br />
#include <br />
<br />
int main(int argc, char* argv[])<br />
{<br />
&nbsp; std::set set1 {1, 2, 3, 4, 5, 6};<br />
&nbsp; // équivalent à<br />
&nbsp; std::set set2 = {1, 2, 3, 4, 5, 6};<br />
&nbsp; // équivalent à<br />
&nbsp; std::set set3 ({1, 2, 3, 4, 5, 6});<br />
&nbsp; <br />
&nbsp; return 0;<br />
}</div></div>
<p>Pour initialiser notre ensemble, c&rsquo;est déjà bien mieux ! Mais bon, on ne va pas dire qu&rsquo;on a déjà créé notre DSEL car on n&rsquo;a encore rien codé du tout. Tout ce qu&rsquo;on a fait, c&rsquo;est reprendre ce que C++11 nous proposait déjà.</p>
<h2 id="la-structure-ensemble">La structure « Ensemble »</h2>
<p>A présent, nous allons ajouter la possibilité de récupérer l&rsquo;union de deux ensembles. Pour satisfaire ce besoin, on va créer une structure afin de <strong>wrapper</strong> un std::set.</p>
<p>Je vais construire cette structure pas à pas avec des explications :</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 Ensemble<br />
{<br />
&nbsp; std::set _set;<br />
};</div></div>
<p>Dans la partie précédente, j&rsquo;ai oublié de vous mentionner quelque chose. La jolie syntaxe disponible depuis C++11 pour initialiser un container <strong>{x, y, z, …}</strong>, on peut aussi l&rsquo;utiliser nous-même pour nos objets en tant qu&rsquo;argument de constructeur ou de fonction membre ! Pour cela, on utilise <strong>std::initializer_list</strong> qui se comporte comme un objet proxy récupérant l&rsquo;initialisation sous forme de tableaux <strong>{}</strong> et renvoyant une liste. On l&rsquo;ajoute à notre constructeur.</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 Ensemble<br />
{<br />
&nbsp; Ensemble(std::initializer_list list) // pour permetre les initialisations comme un tableau {1, 2, 3, …}<br />
&nbsp; &nbsp; : _set(list) // on copie le contenu de notre liste dans notre set<br />
&nbsp; {<br />
<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; std::set _set;<br />
};</div></div>
<p>Grâce à notre constructeur, on va pouvoir créer des objets de cette manière :</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">Ensemble E1 {1, 2, 3};<br />
Ensemble E1 = {1, 2, 3};<br />
Ensemble E1 ({1, 2, 3});</div></div>
<p>Finalement, il ne nous manque plus qu&rsquo;à coder &quot;l&rsquo;union de deux ensembles&quot;. Pour cela, nous allons simplement surcharger l&rsquo;opérateur + pour renvoyer un nouvel ensemble, comme si l&rsquo;union était une opération binaire (c&rsquo;est-à-dire avec deux opérandes) de type a = b + c. Encore une fois, la bibliothèque standard est bien fournie et propose la fonction <strong><a href="http://www.cplusplus.com/reference/algorithm/set_union/">std::set_union</a></strong> qui à partir d&rsquo;itérateurs d&rsquo;entrée et de sortie va effectuer l&rsquo;union de deux <em>containers</em>.</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">struct Ensemble<br />
{<br />
&nbsp; Ensemble(std::initializer_list list) // pour permetre les initialisations comme un tableau {1, 2, 3, …}<br />
&nbsp; &nbsp; : _set(list) // on copie le contenu de notre liste dans notre set<br />
&nbsp; {<br />
<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; Ensemble(std::set set) <br />
&nbsp; &nbsp; : _set(set)<br />
&nbsp; {<br />
<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; Ensemble Union(const Ensemble&amp;amp; ensemble)<br />
&nbsp; {<br />
&nbsp; &nbsp; std::set result;<br />
<br />
&nbsp; &nbsp; // union des deux ensembles<br />
&nbsp; &nbsp; std::set_union(<br />
&nbsp; &nbsp; &nbsp; _set.begin(), <br />
&nbsp; &nbsp; &nbsp; _set.end(), <br />
&nbsp; &nbsp; &nbsp; ensemble._set.begin(), <br />
&nbsp; &nbsp; &nbsp; ensemble._set.end(), <br />
&nbsp; &nbsp; &nbsp; std::inserter(result, result.begin()) // itérateur d'insertion<br />
&nbsp; &nbsp; );<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; // il n'y a pas besoin de trier ni de vérifier <br />
&nbsp; &nbsp; // que chaque élément est unique, std::set le fait automatiquement !<br />
<br />
&nbsp; &nbsp; return Ensemble(result);<br />
&nbsp; }<br />
<br />
&nbsp; Ensemble operator+(const Ensemble&amp;amp; e)<br />
&nbsp; {<br />
&nbsp; &nbsp; return Union(e);<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; std::set _set;<br />
};</div></div>
<p>Vous avez peut-être remarqué que j&rsquo;utilise un itérateur d&rsquo;insertion : <strong><a href="http://www.cplusplus.com/reference/std/iterator/inserter/">std::inserter</a></strong>. Pour la simple et bonne raison qu&rsquo;on travaille avec des <strong>std::set</strong> et que les valeurs ce <em>container</em> sont immuables après initialisation. Si on avait travaillé avec des <strong>std::vector</strong>, nous aurions pu remplacer <em>std::inserter(result, result.begin())</em> par <em>result.begin()</em>.</p>
<p>Petit point sémantique: <em>Ensemble</em> est une structure à <strong>sémantique de valeur</strong>, n&rsquo;oubliez donc pas de coder sa <strong><a href="http://cpp.developpez.com/faq/cpp/index.php?page=classes#CLASS_forme_canonique_coplien">forme canonique orthodoxe de Coplien</a></strong>. Je ne l&rsquo;affiche pas par gain d&rsquo;espace mais pensez-y !</p>
<p><em>Last but not least</em>, on va se permettre une petite fantaisie. En tête de notre fichier on va placer cela pour imiter la notation U comme l&rsquo;<em>union</em> en mathématiques. <em>Attention: ne nommez pas une variable seulement &quot;U&quot; après ça, elle sera remplacée par un + à la compilation.</em></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">#define U +</div></div>
<p>Ainsi grâce à nos petites manoeuvres, ces codes là sont équivalents :</p>
<p>&lt;code class=&quot;sourceCode cpp&quot;Ensemble E1 = Ensemble ({1, 2, 3}) + Ensemble({4, 5, 6});</code></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">Ensemble E1 = Ensemble {1, 2, 3} &nbsp; U &nbsp; Ensemble {4, 5, 6};</div></div>
<p>Nous garderons la deuxième syntaxe car elle est bien plus proche de ce qu&rsquo;on a en mathématiques.</p>
<p>Nous pouvons être fier puisque nous venons d&rsquo;écrire notre tout petit DSEL pour manipuler des ensembles !</p>
<p>Code récapitulatif :</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">#include <br />
#include <br />
#include <br />
<br />
#define U +<br />
<br />
struct Ensemble<br />
{<br />
&nbsp; Ensemble(std::initializer_list list) // pour permetre les initialisations comme un tableau {1, 2, 3, …}<br />
&nbsp; &nbsp; : _set(list) // on copie le contenu de notre liste dans notre set<br />
&nbsp; {<br />
<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; Ensemble(std::set set) <br />
&nbsp; &nbsp; : _set(set)<br />
&nbsp; {<br />
<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; Ensemble Union(const Ensemble&amp;amp; ensemble)<br />
&nbsp; {<br />
&nbsp; &nbsp; std::set result;<br />
<br />
&nbsp; &nbsp; // union des deux ensembles<br />
&nbsp; &nbsp; std::set_union(<br />
&nbsp; &nbsp; &nbsp; _set.begin(), <br />
&nbsp; &nbsp; &nbsp; _set.end(), <br />
&nbsp; &nbsp; &nbsp; ensemble._set.begin(), <br />
&nbsp; &nbsp; &nbsp; ensemble._set.end(), <br />
&nbsp; &nbsp; &nbsp; std::inserter(result, result.begin()) // itérateur d'insertion<br />
&nbsp; &nbsp; );<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; // il n'y a pas besoin de trier ni de vérifier <br />
&nbsp; &nbsp; // que chaque élément est unique, std::set le fait automatiquement !<br />
<br />
&nbsp; &nbsp; return Ensemble(result);<br />
&nbsp; }<br />
<br />
&nbsp; Ensemble operator+(const Ensemble&amp;amp; e)<br />
&nbsp; {<br />
&nbsp; &nbsp; return Union(e);<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; std::set _set;<br />
};<br />
<br />
int main(int argc, char* argv[])<br />
{<br />
&nbsp; Ensemble E1 {42, 1337};<br />
<br />
&nbsp; Ensemble E2 = Ensemble {1, 3, 5} U Ensemble {2, 4, 6};<br />
&nbsp; // E2 {1, 2, 3, 4, 5, 6}<br />
&nbsp; &nbsp; <br />
&nbsp; Ensemble Final = E1 &nbsp; U &nbsp; E2;<br />
&nbsp; // Final {1, 2, 3, 4, 5, 6, 42, 1337}<br />
&nbsp; &nbsp; <br />
&nbsp; return 0;<br />
}</div></div>
</pre>
<h1 id="conclusion">Conclusion</h1>
<p>Cet article touche à sa fin, nous avons créer notre petit DSEL juste avec la bibliothèque standard, ça n&rsquo;était pas très compliqué mais au final, quand on travaille sur des ensembles c&rsquo;est bien plus lisible comme ça non ? Si vous voulez le continuer un petit peu, la lib standard propose <a href="http://www.cplusplus.com/reference/algorithm/set_intersection/">set_intersection</a> renvoyant l&rsquo;intersection de deux <em>containers</em>. Après tout avec l&rsquo;exemple au dessus, ça ne devrait pas être compliqué et ça serait plutôt sympathique d&rsquo;écrire quelque chose en remplaçant le symbole de l&rsquo;intersection <strong>∩</strong> par un <strong>n</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">Ensemble Final = Ensemble {1, 2, 3} &nbsp;n &nbsp;Ensemble {2, 3, 4};</div></div>
<p>Tout de même, j&rsquo;avoue que je n&rsquo;ai pas choisi le sujet le plus difficile, la syntaxe du C++ avec les initialisations entre accolades se prétaient déjà bien au jeu. Mais il existe des utilisations bien plus impressionnantes, dans cet article par exemple <a href="http://cpp-next.com/archive/2010/10/expressive-c-expression-extension-part-two/">Expressive C++: A Lambda Library in 30 Lines</a>, en utilisant Boost.Proto, on arrive à créer une petite <em>library</em> pour écrire des fonctions lambdas !</p>
<p>Si vous voulez approfondir le sujet, vous pouvez toujours lire la série <a href="http://cpp.developpez.com/redaction/data/pages/rubrique/cpp/boost/proto/index/">C++ expressif avec Boost.Proto</a>. N&rsquo;hésitez pas à me faire part de vos améliorations/questions/commentaires !</p></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
