<?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>Code Arts</title>
	<atom:link href="http://blog.rswhite.de/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.rswhite.de</link>
	<description></description>
	<lastBuildDate>Thu, 12 Jan 2012 23:07:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>D: C++ Streamoperator</title>
		<link>http://blog.rswhite.de/archives/717</link>
		<comments>http://blog.rswhite.de/archives/717#comments</comments>
		<pubDate>Thu, 12 Jan 2012 19:07:26 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[C(++)]]></category>
		<category><![CDATA[D]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=717</guid>
		<description><![CDATA[Ich hatte gestern mal wieder mit C++ zu tun und muss sagen: ich liebe dessen Streamoperatoren. Gut bei der Ausgabe mittels cout nervt es mich schon hin und wieder, aber das einlesen von Konsoleneingaben mittels cin und vor allem bei Dateien ist es wirklich bequem und meiner Meinung nach nicht schwer zu verstehen. Vielleicht etwas [...]]]></description>
			<content:encoded><![CDATA[<p>Ich hatte gestern mal wieder mit C++ zu tun und muss sagen: ich liebe dessen Streamoperatoren. Gut bei der Ausgabe mittels <code>cout</code> nervt es mich schon hin und wieder, aber das einlesen von Konsoleneingaben mittels <code>cin</code> und vor allem bei Dateien ist es wirklich bequem und meiner Meinung nach nicht schwer zu verstehen. Vielleicht etwas kryptisch auf den ersten Blick, zugegeben, aber das legt sich bald wenn man sich erstmal daran gewöhnt hat. <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Für die zukünftige Version von Dgame habe ich mir die Streamoperationen von C++ emuliert, indem ich den Shift Operator überladen habe.<br />
Damit habe ich mir eine Input/Output sowie File Stream Emulierung gebastelt:</p>
<p>Input &#038; Output:</p>
<p><a href='http://blog.rswhite.de/archives/717#SID717_1_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p>Und File Stream:</p>
<p><a href='http://blog.rswhite.de/archives/717#SID717_2_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p>Vielleicht hat ja jemand Interesse und/oder Spaß daran. <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/717/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Referenz oder doch Zeiger?</title>
		<link>http://blog.rswhite.de/archives/705</link>
		<comments>http://blog.rswhite.de/archives/705#comments</comments>
		<pubDate>Fri, 06 Jan 2012 21:35:26 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[C(++)]]></category>
		<category><![CDATA[D]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=705</guid>
		<description><![CDATA[In C oder C++ würde man stets einen Zeiger übergeben, sofern man in der zu übergebenen Methode/Funktion diesem Parameter einen neuen Wert zuweisen würde. Denn ansonsten würde dieser neu zugewiesene Wert am Ende der Methode/Funktion wieder verfallen. Es ist nicht einmal so, dass man das tun würde, sondern das man es tun muss, da man [...]]]></description>
			<content:encoded><![CDATA[<p>In C oder C++ würde man stets einen Zeiger übergeben, sofern man in der zu übergebenen Methode/Funktion diesem Parameter einen neuen Wert zuweisen würde. Denn ansonsten würde dieser neu zugewiesene Wert am Ende der Methode/Funktion wieder verfallen.<br />
Es ist nicht einmal so, dass man das tun würde, sondern das man es tun muss, da man in C/C++ keine andere Wahl hat.<br />
In D und auch in C# hat man dafür das Keyword &#8220;ref&#8221;, wobei man in D dennoch noch Zeiger benutzen kann.<br />
Bei einem Benchmark, welches denn nun schneller sei, stellte ich fest, dass kaum merkbare Unterschiede festzustellen sind und ref als Syntax wirklich angenehmer wirkt.<br />
Doch wofür dann noch, außer natürlich für C Kompatibilität, in D Zeiger benutzen?<br />
<span id="more-705"></span><br />
Darüber hatte ich auch einige Zeit nach gegrübelt und schließlich diese Gedankengänge verworfen, da das export- und importieren von C Funktionen in D einer der wertvollsten Eigenschaften ist, die die Sprache bietet.<br />
Doch heute traf ich auf eine Gelegenheit wo Zeiger wirklich die einzige gute Wahl waren.<br />
Ich hatte eine Methode mit der ich einen Status abfragen konnte und wollte als optionalen Parameter anbieten, dass, sofern der Status abweicht, der wirkliche Status in diesem Parameter gespeichert wird und per Referenz zurückgegeben werden kann.<br />
Natürlich wählte ich sofort ref. Und damit es optional ist wies ich dieser Parameter schließlich den Default Wert &#8220;null&#8221; zu, in etwa so:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">bool</span> valid_status<span class="br0">&#40;</span><span class="kw4">const</span> App app<span class="sy0">,</span> <span class="kw2">ref</span> Status real_status <span class="sy0">=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></div></div></div></div></div></div></div>


<p>Doch endete mit einem Error, dass &#8220;real_status&#8221; kein lvalue sei. Das ist auch korrekt. Und damit war die Möglichkeit einen optionalen Parameter anzubieten dahin. Nun gab es vorerst nur einen weiteren Weg: zwei Methoden, einmal mit und einmal ohne zweiten Parameter. Eine typische Java Lösung.<br />
Das gefiel mir nicht. Doch dann kam mir der Gedanke an Zeiger wieder und et voilà: es funktioniert bestens so:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">bool</span> valid_status<span class="br0">&#40;</span><span class="kw4">const</span> App app<span class="sy0">,</span> Status<span class="sy0">*</span> real_status <span class="sy0">=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></div></div></div></div></div></div></div>


<p>In dem Methodenrumpf muss nun natürlich statt einfach: <code>real_status = real_app_status;</code> ein Sternchen vor &#8220;real_status&#8221;, um es als Zeiger zu kennzeichnen, also so: <code>*real_status = real_app_status;</code> aber das war es auch schon <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Man sollte allerdings auf der Hut sein. Viele D Konstrukte besitzen eine &#8220;.ptr&#8221; property welche einen C Zeiger des Konstrukts zurückgibt, damit C Kompatibilität gewährleistet ist.<br />
Es kann vorkommen, dass man nun etwas verwirrt ist und/oder unbedacht mit &#8220;construct.ptr&#8221; und &#8220;&#038;construct&#8221; arbeitet.<br />
Mir fiel es heute auf, als ich mit OpenGL hantierte und einem Buffer meine Vertices übergeben sollte, welche sich aus einem Vertex Array <code>Vertex[]</code> zusammensetzen.</p>
<p>Ich übergab <code>glBufferData</code> &#8220;&#038;vertices&#8221; und wunderte mich, dass ich keine (korrekte) Ausgabe erhielt.<br />
Doch dann erkannte ich, dass ich die &#8220;.ptr&#8221; property verwenden muss.</p>
<p>Eine kurze Erklärung dazu:<br />
Arrays in C/C++ sind von sich aus im eigentlichen Sinne bereits Pointer und bei deren Übergabe als Parameter wird ein lediglich ein Pointer auf das erste Element dieses Arrays übergeben. Das ist auch der Grund dafür, dass man in sämtlichen OpenGL Tutorials (zumindest denen die C/C++ benutzen), auch immer nur <code>vertices</code>, anstatt <code>&#038;vertices</code> (oder eben in D auch <code>vertices.ptr</code>) liest.</p>
<p>Eine kleine Veranschaulichung des ganzen:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw2">import</span> std.<span class="me1">stdio</span><span class="sy0">;</span>
&nbsp;
<span class="kw4">struct</span> Vertex <span class="br0">&#123;</span>
	<span class="kw4">float</span> x<span class="sy0">,</span> y<span class="sy0">,</span> z<span class="sy0">;</span>
&nbsp;
	<span class="kw2">this</span><span class="br0">&#40;</span><span class="kw4">float</span> x<span class="sy0">,</span> <span class="kw4">float</span> y<span class="sy0">,</span> <span class="kw4">float</span> z <span class="sy0">=</span> <span class="nu16">0.0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw2">this</span>.<span class="me1">x</span> <span class="sy0">=</span> x<span class="sy0">;</span>
		<span class="kw2">this</span>.<span class="me1">y</span> <span class="sy0">=</span> y<span class="sy0">;</span>
		<span class="kw2">this</span>.<span class="me1">z</span> <span class="sy0">=</span> z<span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">void</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	Vertex<span class="br0">&#91;</span><span class="br0">&#93;</span> data<span class="sy0">;</span>
	data <span class="sy0">~=</span> Vertex<span class="br0">&#40;</span><span class="nu0">10</span><span class="sy0">,</span> <span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span>
	data <span class="sy0">~=</span> Vertex<span class="br0">&#40;</span><span class="nu0">100</span><span class="sy0">,</span> <span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span>
	data <span class="sy0">~=</span> Vertex<span class="br0">&#40;</span><span class="nu0">10</span><span class="sy0">,</span> <span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">;</span>
	data <span class="sy0">~=</span> Vertex<span class="br0">&#40;</span><span class="nu0">100</span><span class="sy0">,</span> <span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="kw4">auto</span> ptr1 <span class="sy0">=</span> data.<span class="me1">ptr</span><span class="sy0">;</span>
	<span class="kw4">auto</span> ptr2 <span class="sy0">=</span> <span class="sy0">&amp;</span>data<span class="sy0">;</span>
&nbsp;
	writeln<span class="br0">&#40;</span><span class="kw2">typeid</span><span class="br0">&#40;</span><span class="kw2">typeof</span><span class="br0">&#40;</span>ptr1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	writeln<span class="br0">&#40;</span><span class="kw2">typeid</span><span class="br0">&#40;</span><span class="kw2">typeof</span><span class="br0">&#40;</span>ptr2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>ergibt:</p>
<blockquote><p>
D:\D\D_Scripts\c_to_d_interfacing\SDL_1.3\tests>pointer<br />
pointer.Vertex*<br />
pointer.Vertex[]*
</p></blockquote>
<p>Kein Wunder also, OpenGL brauchte schließlich einen Pointer auf das <strong>gesamte</strong> Array. Und da wir in D und nicht in C sind, reichte ein &#8220;&#038;vertices&#8221; oder gar nur &#8220;vertices&#8221; nicht aus.</p>
<p>Ich wollte es auch nur gesagt haben, es gibt sicher einige Situationen, wo dieses Wissen hilfreich sein könnte. <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/705/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>D: mutable Keyword</title>
		<link>http://blog.rswhite.de/archives/675</link>
		<comments>http://blog.rswhite.de/archives/675#comments</comments>
		<pubDate>Wed, 12 Oct 2011 11:56:05 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[C(++)]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=675</guid>
		<description><![CDATA[Einige kennen sicher das Keyword mutable aus C++. In D gibt es kein entsprechendes Äquivalent, const bleibt auch const. Diese Gebenheit nervte mich in letzter Zeit jedoch etwas. Vor allen bei debugging/Log Sachen wäre es mal nützlich, einfach eine mutable Eigenschaft in einer als const Deklarierten Methode zu verwenden. Für alle die es nicht wissen: [...]]]></description>
			<content:encoded><![CDATA[<p>Einige kennen sicher das Keyword <a href="http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Im_Zusammenhang_mit_Klassen/_mutable_und_volatile">mutable</a> aus C++.<br />
In D gibt es kein entsprechendes Äquivalent, const bleibt auch const. Diese Gebenheit nervte mich in letzter Zeit jedoch etwas. Vor allen bei debugging/Log Sachen wäre es mal nützlich, einfach eine mutable Eigenschaft in einer als const Deklarierten Methode zu verwenden.</p>
<p>Für alle die es nicht wissen: eine const deklarierte Methode sieht folgendermaßen aus:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1"><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1"><span class="co1">//some code here</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Das <code>const</code> &#8220;sagt&#8221; dem Compiler sozusagen, dass diese Methode das Objekt an sich nicht verändert.</p>
<p>Allerdings: wenn eine Eigenschaft eines Objekts verändert wird, ändert sich doch der komplette Zustand des Objekts. Also wozu als mutable deklarieren?<br />
Debugging oder Logging Mitschnitte (oder derartig vergleichbares) verändern nicht wirklich den Zustand, jedenfalls nicht ausschlaggebend. Und für Debugging immer wieder das const auszukommentieren und in der Release wieder hinzuzufügen kann schon nach einer kurzen Weile etwas &#8220;nerven&#8221;.</p>
<p>Daher habe ich mir eine kleine Struktur geschrieben und einen dazugehörigen Test der die Benutzung demonstriert.<br />
Damit sollte das mutable aus C++ emuliert werden. Eventuell hat ja jemand Interesse daran:</p>
<p><a href='http://blog.rswhite.de/archives/675#SID675_1_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<h3>Nachtrag vom 12.01.2012</h3>
<p>Ich habe die obige Struktur nochmal überarbeitet und an den Feinheiten geschliffen. Zudem habe ich nun daraus eine Klasse gemacht (geschah eher nach belieben als aus einem konkretem Grund).<br />
Hier ist der Code:</p>
<p><a href='http://blog.rswhite.de/archives/675#SID675_2_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/675/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vertex Buffer Objects (VBO)</title>
		<link>http://blog.rswhite.de/archives/617</link>
		<comments>http://blog.rswhite.de/archives/617#comments</comments>
		<pubDate>Thu, 15 Sep 2011 08:10:47 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[D]]></category>
		<category><![CDATA[Derelict]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=617</guid>
		<description><![CDATA[Da sich die Frage aus dem letzten Artikel geklärt hat (ja, OpenGL ist SDL wahrlich aus vielerlei Gründen vorzuziehen) möchte ich nun mein neu erwonnenes Wissen teilen. In diesem Artikel möchte ich mich mit Vertex Buffer Objects, kurz VBO, beschäftigen. Viele werden den folgenden Sachverhalt kennen oder zumindest in der Theorie nachvollziehen können. Angenommen wir [...]]]></description>
			<content:encoded><![CDATA[<p>Da sich die Frage aus dem letzten Artikel geklärt hat (ja, OpenGL ist SDL wahrlich aus vielerlei Gründen vorzuziehen) möchte ich nun mein neu erwonnenes Wissen teilen.</p>
<p>In diesem Artikel möchte ich mich mit <strong>Vertex Buffer Objects</strong>, kurz <strong>VBO</strong>, beschäftigen.<br />
Viele werden den folgenden Sachverhalt kennen oder zumindest in der Theorie nachvollziehen können.<br />
Angenommen wir haben eine TileMap. Den sichtbaren Ausschnitt der Karte (<em>View</em>) werden wir mit sehr hoher Wahrscheinlichkeit nicht in jedem Frame ändern, sondern er wird mehrere Frames überstehen. Je nach Kartengröße eventuell sogar die gesamte Spielzeit, da gar kein Scrolling nötig ist.<br />
Versteht sich von selbst: ist die gesamte Karte kleiner oder gleich groß wie das Fenster -> kein Scrollen notwendig, da alles bereits zu sehen ist.<br />
Allerdings zeichnet man üblicherweise in jedem Frame wieder und wieder die gesamte Karte. Und das braucht bei größeren Karten eine Menge Rechenlast.<br />
Man kann zwar das ganze etwas abmildern, in dem man von vorn herein nicht sichtbare Teile der Karte nicht zeichnet, aber die sichtbaren Tiles/Teile der Karte müssen dennoch immer und immer wieder über den <a href="http://de.wikipedia.org/wiki/Bus_(Datenverarbeitung)">Bus</a> in den Grafikspeicher.<br />
<span id="more-617"></span><br />
Hier ein Beispiel einer scrollbaren Karte (für Informatiker: <code>bool scroll = sizeof(map) > sizeof(window) ? true : false;</code>)<br />
Anfangs Ansicht:</p>
<p><a href='http://blog.rswhite.de/archives/617#SID617_1_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p>und die spätere gescrollte Ansicht, die zweite Hälfte wenn man so will</p>
<p><a href='http://blog.rswhite.de/archives/617#SID617_2_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p>Beides Views, welche eine statische Ansicht repräsentieren, solang&#8217; der Protagonist nicht so weit läuft, als das gescrolled werden muss.<br />
Alle Render Aufrufe in dieser statischen Zeit sind absolute Verschwendung (im Normalfall).</p>
<p>Bei meinem D Framework <strong>Dgame</strong> hab ich es so gelöst:<br />
Das aktuell gezeichnete Rechteck (der aktuelle View/Blickpunkt) wird zu Vergleichszwecken gespeichert, die Karte/die Tiles auf eine zweite Surface gezeichnet (die ebenso groß ist wie der View; was leider recht Speicherlastig werden kann) und dann auf den Bildschirm bzw. ins Fenster geblittet.<br />
Wenn im nächsten Frame nun wieder der gleiche View gezeichnet werden soll, weil sich nichts verändert hat und der Ausschnitt der sichtbarne Karte somit gleich bleibt, dann wird die bereits gezeichnete Karte auf dne Bildschirm geblittet und wir sparen und das mühselige und Rechenlastige sowie nochmalige Zusammensetzen der Karte. Dies geschieht solange, bis sich eben etwas ändert. Die Heap Allokation und aufwendige Berechnungen der zusammenpuzzelung der Karte aus einem Tileset bleibt uns somit in nicht notwendigen Momenten (was etwa 90% der Spielzeit ausmachen kann) erspart. Solange wird also nicht gerade ein Side-Scroll und Jump &#8216;n Run Spiel erstellen, ist dies schonmal ein Anfang, Speicher, Heap Allokation und Rechenlast zu sparen.</p>
<p>Mit OpenGL gibt es zwei andere, wesentlich effizientere Methoden: <a href="http://wiki.delphigl.com/index.php/Displaylisten">Display Listen</a> sowie <a href="http://wiki.delphigl.com/index.php/Tutorial_Vertexbufferobject">Vertex Buffer Objects</a>, kurz und im weiteren VBO. Ersteres ist in neueren Versionen bereits deprecated und sollte daher nicht mehr genutzt werden. Aus diesem und aus dem Grund, das VBO&#8217;s noch etwas effizienter und Performanter sind, werde ich nur auf diese eingehen.<br />
VBO&#8217;s sind sozusagen eigene Speicherbereiche. Man reserviert sich faktisch Speicherplatz für Koordinaten von Texturen und ihren Platz auf dem Fenster. Oder nur Koordinaten um dann Primitive zu zeichnen.<br />
Dies spart immens Rechenzeit, da man sich die herkömmliche Übertragung der Daten in dne Speicher spart, also sie gleich im Speicher verwahrt und ohne langwierige und aufwendige Übertragung per <a href="http://de.wikipedia.org/wiki/Bus_(Datenverarbeitung)">Bus</a> jedes mal erneut dahin transportiert.<br />
Ich habe mir mehrere <a href="http://wiki.delphigl.com/index.php/VBO_ohne_glInterleavedArrays">Tutorials zu VBO&#8217;s</a> durchgelesen, in meinem <a href="http://www.spieleprogrammierer.de/15-2d-3d-grafikprogrammierung/16483-vbo-textur-koordinaten/">Haupt-Forum gepostet</a>, mit diversen Leuten aus dem ICQ geschrieben.<br />
Die wohl populärste Methode, Textur und Vertex Koordinaten zu speichern und somit Bildausschnitte und ihre Position im Speicher zu behalten stellte sich als etwas komplizierter heraus und da Tutorials und Hilfe oftmals versagten musste ich mir selbst über 3 endlose Tage alles zusammensuchen und -lesen, bis es endlich klappte. Damit es andere leichter haben, schreibe ich diesen Artikel.<br />
Zunächst einmal die Funktionen die wir benötigen, ich lasse dabei mal außer Acht, das Texturen geladen und gezeichnet werden. Dazu soll dieses Tutorial nicht dienen.<br />
Als da wären:</p>
<ul>
<li><a href="http://wiki.delphigl.com/index.php/glGenBuffers">glGenBuffers</a></li>
<li><a href="http://wiki.delphigl.com/index.php/glDeleteBuffers">glDeleteBuffers</a></li>
<li><a href="http://wiki.delphigl.com/index.php/glBindBuffer">glBindBuffer</a></li>
<li><a href="http://wiki.delphigl.com/index.php/glBufferData">glBufferData</a></li>
<li><a href="http://wiki.delphigl.com/index.php/glMapBuffer">glMap</a> und <a href="http://wiki.delphigl.com/index.php/glUnmapBuffer">glUnmap</a></li>
<li><a href="http://wiki.delphigl.com/index.php/glDrawArrays">glDrawArrays</a></li>
</ul>
<p>Was wir nun machen müssen ist zunächst einmal einen Buffer anfordern/generieren mit</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1">GLuint vboId<span class="sy0">;</span>
glGenBuffers<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="sy0">&amp;</span>vboId<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Nachdem wir nun einen Buffer bzw. eine ID für einen Buffer angefordert haben, müssen wir unsere Daten speichern.<br />
Wir &#8220;binden&#8221; zunächst einmal nur Vertex Koordinaten:</p>
<p><a href='http://blog.rswhite.de/archives/617#SID617_3_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p><code>glDrawArrays</code> zeichnet uns ein schwarzes Rechteck an der Position (100|100) und mit der Größe 100&#215;100 px,<br />
wie hier zu sehen
<p><a href='http://blog.rswhite.de/archives/617#SID617_4_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p>Das <code>glDisable(GL_TEXTURE_2D);</code> ist deswegen notwendig, da ansonsten die Farbänderung von <code>glColor3f</code> sich <strong>nicht</strong> auf Primitive sondern lediglich auf die Farbkomponenten von Texturen ausüben würden. Wir würden das Rechteck also ansonsten nicht sehen.<br />
<code>glBindBuffer</code> aktiviert bzw. bindet den Buffer, wie der Code Kommentar schon aussagt, und kennzeichnet ihn somit als aktuell. <code>glBufferData</code> überträgt dann die Daten in der angegebenen Größe in den Grafikspeicher.<br />
Was <a href="http://wiki.delphigl.com/index.php/glVertexPointer">glVertexPointer</a> macht überlass ich mal dem Leser <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Das wäre schon einmal ein Anfang. Wir haben nun ein schwarzes Rechteck, die Koordinaten dafür im Speicher und müssen sie nicht mehr über den Bus schicken. Wenn wir Position und/oder Größe ändern wollen, dann überschreiben wir mit dme gleichen Verfahren einfach die alten Buffer Daten. </p>
<blockquote><p>Oder man guckt sich <a href="http://wiki.delphigl.com/index.php/glBufferSubData">glBufferSubData</a>. Was ich leider noch nicht groß getan habe, also eventuell folgt noch ein Update zu diesem Artikel.</p></blockquote>
<p> &raquo; Primitive mittels eines Vertex Buffers im Speicher zu halten, ist auch eine Idee, die ich mir für Dgame 1.7 durch den Kopf gehen lassen werden.</p>
<p>Aber nun zum eigentlich genialen: Texturen oder Ausschnitte von Texturen gemeinsam mit ihrer Position im Speicher zu verwahren um (zumeist) statische bzw. sich langsam / wenig ändernde Objekte nicht immer und immer wieder zeichnen zu müssen. Wer sich hier noch fragt &#8220;Warum sollte man das vermeiden?&#8221; den lege ich nahe, noch einmal von vorne zu lesen, denn dann kam der Sinn der hinter VBO&#8217;s steckt wohl noch nicht ganz an. <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Für dieses Vorhaben legen wir uns (zumindest in der einfachsten Variante) einfach einen zweiten VBO an, der dann statt der Vertex Koordinaten eben die Texturkoordinaten behinhaltet.<br />
Das ganze Verfahren sieht äquivalent zu oberen Code Ausschnitt aus, jedoch nutzen wir statt des oben kurz angesprochenen <strong>glVertexPointer</strong>&#8216;s <a href="http://wiki.delphigl.com/index.php/glTexCoordPointer">glTexCoordPointer</a>.</p>
<p>Wir wollen nun einen Teil dieses Tilesheets zeichnen. Und zwar an der Position (100|100) und der Größe von 100&#215;100 px. Also exakt die Ausmaße unseres schwarzes Rechtecks.<br />
Dazu machen wir folgendes:</p>
<p><a href='http://blog.rswhite.de/archives/617#SID617_5_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p>Und schon haben wir einen Ausschnitt unserer Textur im Speicher und können ihn jederzeit ohne weitere Speicher Aufwendung rendern lassen.<br />
Das Prinzip lässt sich sehr einfach auf TileMaps übertragen, wie man ja weiter oben anhand der Bilder sieht. Das zeichnen einer solchen Map (auch wenn man alle nicht sichtbaren Tiles nicht zeichnete) erreichte ohne VBO&#8217;s eine Framerate von 200 oder 300. Mit VBO&#8217;s bis zu 1160. Man sieht also den enormen Vorteil.<br />
In Dgame 1.6 bekam ich beim dauerhaften Rendering eine maximale FPS von unter 60. Mit der oben genannten Behilfsmethode des selbstgemachten &#8220;Doppelbuffers&#8221; kam ich dann auf knapp 300.<br />
Hier sieht man also auch sehr gut den Unterschied zwischen SDL 1.2 und OpenGL.</p>
<p>Ich hoffe der Beitrag war lehrreich und nicht zulang, bei Fragen, Kritik o.a. immer her damit.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/617/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenGL oder SDL?</title>
		<link>http://blog.rswhite.de/archives/597</link>
		<comments>http://blog.rswhite.de/archives/597#comments</comments>
		<pubDate>Wed, 24 Aug 2011 00:21:33 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[D]]></category>
		<category><![CDATA[Derelict]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=597</guid>
		<description><![CDATA[Die Frage stellt sich mir mehr und mehr. Ich arbeite derzeit in den letzten Zügen an Dgame 1.6 und möchte danach direkt mit den Arbeiten an Version 1.7 beginnen. Dort soll die große Änderung der Umstieg von SDL zu OpenGL sein, wobei nach neueren Kenntnisstand eher eine Symbiose zustande käme. So würde man mittels der [...]]]></description>
			<content:encoded><![CDATA[<p>Die Frage stellt sich mir mehr und mehr.<br />
Ich arbeite derzeit in den letzten Zügen an <a href="http://blog.rswhite.de/archives/184">Dgame</a> <strong>1.6</strong> und möchte danach direkt mit den Arbeiten an Version <strong>1.7</strong> beginnen.<br />
Dort soll die große Änderung der Umstieg von SDL zu OpenGL sein, wobei nach neueren Kenntnisstand eher eine Symbiose zustande käme.<br />
So würde man mittels der SDL das eigentliche Fenster erstellen und würde mit SDL_image weiterhin Bilder laden, diese dann aber, bzw. ihre Pixelsturktur, in eine GL Textur laden. Für etwaige Bildverarbeitung würden dann SDL spezifische Funktionen zu Hilfe genommen werden, wie es jetzt bereits der Fall ist.<br />
OpenGL bzw. dessen Texturen würden für schnelleres und performanteres blitten und etwaige andere Bild Verarbeitungs Maßnahmen zu Hilfe genommen werden, wie etwa Rotation und Zoom.<br />
<span id="more-597"></span><br />
Ich habe die letzten 3 Tage damit zugebracht mit einige Tutorials etc. zu OpenGL und SDL mit OpenGL durchgelesen und mir damit, so meine ich, ein wenig Basiswissen angesammelt.<br />
So habe ich bisher eine einfache Textur Klasse geschrieben, die genau den obigen Zweck erfüllt, und mittels der Pixelstruktur GL Texturen generiert.<br />
Auch das Blitten bzw eine dafür gefertigte Klasse existiert.<br />
Was vorher mittels <code>SDL_UpdateRect</code> bzw. <code>SDL_Flip</code> + der Angabe der derzeitigen Fenster Surface ging, wird nun mit einem einfachen <code>SDL_GL_SwapBuffers();</code> erledigt. Dafür müssen allerdings auch sämtliche Bilder, die im Fenster erscheinen sollen, als eine GL Textur existieren. Des Weiterne sollte man beim Erstellen der VideoSurface nicht den Flag SDL_OPENGL vergessen.<br />
Für primitive Zeichnungen, wie Linien und andere Körper wäre GL wohl wesentlich performanter als SDL_gfx. Zudem arbeite ich mit einem User-made <a href="http://blog.rswhite.de/archives/186">SDL_gfx fix</a>, da Derelict selbst kein solches anbietet. Daher gehen auch keine wirklichen Verbesserungen seitens des Derelict Coders (aldacron) da mit ein.<br />
Allerdings basiert dies zum Großteil auf Hören Sagen und eigenen Annahmen, objektive Benchmarks werden noch folgen, aber unter Umständen weiß ja hier jemand Rat?<br />
Die eigentlichen Fragen die sich mir stellen:</p>
<ol>
<li>Brauch ich OpenGL, also hab ich wirklich mehr Vorteile als Nachteile?</li>
<li>Ist das blitten und sonstige Handling mit GL Texturen wirklich um soviel performanter?</li>
<li>Soll ich für OpenGL Textur Nutzung eine eigene Klassen erstellen? Und wenn ja, soll sie von der Klasse Surface erben? Oder soll ich das binding an eine GL Textur in der Surface Klasse intern erledigen?</li>
</ol>
<p>Was noch zu sagen wäre: seit etwas mehr als einer Woche bin ich auch auf Twitter anzutreffen; meine letzten Tweets können an der linken Seite jederzeit nachgelesen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/597/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>D: Namespaces</title>
		<link>http://blog.rswhite.de/archives/578</link>
		<comments>http://blog.rswhite.de/archives/578#comments</comments>
		<pubDate>Wed, 15 Jun 2011 22:34:21 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[D]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=578</guid>
		<description><![CDATA[Namespaces? So etwas hat D doch gar nicht. Dafür gibt es Module. Das ist richtig. Es mag den einen oder anderen geben, der sich aus C# oder C++ an namespaces (in deutsch: Namensräume) gewöhnt hat und diese nun in D vermisst. Walter Bright, der Erfinder von D, ist der Meinung, dass Module die Aufgabe von [...]]]></description>
			<content:encoded><![CDATA[<p>Namespaces? So etwas hat D doch gar nicht. Dafür gibt es Module.<br />
Das ist richtig.<br />
Es mag den einen oder anderen geben, der sich aus C# oder C++ an namespaces (in deutsch: Namensräume) gewöhnt hat und diese nun in D vermisst.<br />
Walter Bright, der Erfinder von D, ist der Meinung, dass Module die Aufgabe von namespaces vollständig übernehmen.<br />
Bis zu einem gewissen Grad hat er auch recht, allerdings gibt es einige Dinge, die man vermisst, wenn man sie von namespaces her kennt.</p>
<p>Ein Modul z.B. kann keine Funktionen oder Variablen nach außen hin kapseln, mit der Möglichkeit, später per Prefix oder (in C++ durch using namespace &#8230;) je nach Wahl gänzlich verfügbar zu machen. Die Betonung liegt dabei auf später &#038; auf Prefix. Man kann auch nicht explizit verlangen, dass das Modul als namespace dienen soll, denn dann müsste man irgendwie erzwingen, dass das Modul per static import importiert wird.</p>
<p>Was man aber tun könnte: statische Variablen in einer (finalen) Klasse kapseln. Allerdings: was macht man bei Funktionen?<br />
<span id="more-578"></span><br />
Wir versuchen folgendes:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">class</span> Vector <span class="br0">&#123;</span>
	<span class="kw4">static</span> <span class="kw4">bool</span> contains<span class="br0">&#40;</span>T<span class="sy0">,</span> A<span class="sy0">...</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">const</span> T<span class="br0">&#91;</span><span class="br0">&#93;</span> array<span class="sy0">,</span> <span class="kw4">const</span> A elements<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span> <span class="br0">&#40;</span>elements.<span class="me1">length</span> <span class="sy0">&gt;</span> array.<span class="me1">length</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">foreach</span> <span class="br0">&#40;</span>T e<span class="sy0">;</span> elements<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">if</span> <span class="br0">&#40;</span>Vector.<span class="me1">position</span><span class="br0">&#40;</span>array<span class="sy0">,</span> e<span class="br0">&#41;</span> <span class="sy0">&lt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
			<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw4">static</span> <span class="kw4">int</span> position<span class="br0">&#40;</span>T<span class="sy0">,</span> A<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">const</span> T<span class="br0">&#91;</span><span class="br0">&#93;</span> array<span class="sy0">,</span> <span class="kw4">const</span> A target<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">uint</span> index<span class="sy0">,</span> T e<span class="sy0">;</span> array<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">if</span> <span class="br0">&#40;</span>e <span class="sy0">==</span> target<span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="kw1">return</span> index<span class="sy0">;</span>
			<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">return</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>und probieren einen Aufruf mit</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">int</span><span class="br0">&#91;</span><span class="br0">&#93;</span> numbers <span class="sy0">=</span> <span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">,</span> <span class="nu0">3</span><span class="sy0">,</span> <span class="nu0">4</span><span class="sy0">,</span> <span class="nu0">5</span><span class="sy0">,</span> <span class="nu0">6</span><span class="sy0">,</span> <span class="nu0">8</span><span class="sy0">,</span> <span class="nu0">7</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span> <span class="br0">&#40;</span>Vector.<span class="me1">contains</span><span class="br0">&#40;</span>numbers<span class="sy0">,</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	writeln<span class="br0">&#40;</span><span class="st0">&quot;enthält nummer&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Was erhalten wir? Ein nüchternes Ergebnis.<br />
Wir erhalten einen Linker error:<br />
<code><br />
main.obj(main)<br />
Error 42: Symbol Undefined _D9namespace7__arrayZ<br />
--- errorlevel 1<br />
</code><br />
Und dazu Klassen für eine namespace emulierung missbrauchen? Das ist nicht gerade die feine Art.<br />
Structs? Auch nicht viel besser. Zudem kommt es zum gleichen Fehler.<br />
Aber Warum? Das ist eine wirklich gute Frage. Der Fehler entzieht sich eigentlich meinen Erklärungen.</p>
<p>Aber davon abgesehen gibt es eine wesentlich schönere und elegantere Art: einen kleinen &#8220;Hack&#8221;.<br />
Dieser ermöglicht das was wir wollen ohne Linker Fehler und mit annähernd ähnlicher Benutzung, wie man es von C++ gewöhnt ist.<br />
Dazu müssen wir nur aus der Klasse ein Template machen:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">const</span> string _type_check <span class="sy0">=</span> <span class="st0">&quot;if (is(T == string) &amp;&amp; !is(T == A)) return false;&quot;</span><span class="sy0">;</span>
&nbsp;
<span class="kw4">template</span> Vector<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw4">bool</span> contains<span class="br0">&#40;</span>T<span class="sy0">,</span> A<span class="sy0">...</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">const</span> T<span class="br0">&#91;</span><span class="br0">&#93;</span> array<span class="sy0">,</span> <span class="kw4">const</span> A elements<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw2">mixin</span><span class="br0">&#40;</span>_type_check<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<span class="kw1">if</span> <span class="br0">&#40;</span>elements.<span class="me1">length</span> <span class="sy0">&gt;</span> array.<span class="me1">length</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">foreach</span> <span class="br0">&#40;</span>T e<span class="sy0">;</span> elements<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">if</span> <span class="br0">&#40;</span>array.<span class="me1">position</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="sy0">&lt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
			<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw4">int</span> position<span class="br0">&#40;</span>T<span class="sy0">,</span> A<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">const</span> T<span class="br0">&#91;</span><span class="br0">&#93;</span> array<span class="sy0">,</span> <span class="kw4">const</span> A target<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">uint</span> index<span class="sy0">,</span> T e<span class="sy0">;</span> array<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">if</span> <span class="br0">&#40;</span>e <span class="sy0">==</span> target<span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="kw1">return</span> index<span class="sy0">;</span>
			<span class="br0">&#125;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">return</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Und schon können wir ähnliche Expressions, wie die gewohnten aus C++, benutzen.<br />
Das Äquivalent zu der C++ Expression</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="cpp"><pre class="de1"><span class="kw2">using</span> <span class="kw2">namespace</span> Vector<span class="sy4">;</span></pre></div></div></div></div></div></div></div>


<p> wäre nun</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw2">mixin</span> Vector<span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Es ginge nun so etwas: <code>array.contains(1);</code> , sprich die Funktion &#8220;contains&#8221; auf das array anzuwenden (siehe dazu <a href="http://blog.rswhite.de/archives/487">D: Array Expressions</a>).<br />
Der Zugriff per (renamed) namespace würde ähnlich gehen:<br />
C++:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="cpp"><pre class="de1"><span class="kw2">namespace</span> V <span class="sy1">=</span> Vector<span class="sy4">;</span></pre></div></div></div></div></div></div></div>


<p>D:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw2">mixin</span> Vector V<span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p> und somit <code>V.contains(array, 1);</code></p>
<p>Allerdings: so etwas wie</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="cpp"><pre class="de1"><span class="kw2">using</span> Vector<span class="sy4">::</span><span class="me2">contains</span></pre></div></div></div></div></div></div></div>


<p> oder gar die Erwartung, ohne mixin einfach via <code>Vector.FUNCTION</code> auf die jeweilige Funktion zuzugreifen klappt nicht.<br />
Letzteres scheitert an der Template Anweisung, weswegen ein mixin immer Pflicht bei dieser kleinen Geschichte ist.<br />
Aber wir lernen daraus: D ist flexibel. Vermisst man etwas (aus anderen Sprache o.a.), lässt es sich sehr leicht in D um- und einsetzen. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/578/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>D: Benchmark für Parameter storage classes</title>
		<link>http://blog.rswhite.de/archives/556</link>
		<comments>http://blog.rswhite.de/archives/556#comments</comments>
		<pubDate>Fri, 10 Jun 2011 11:02:54 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[D]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=556</guid>
		<description><![CDATA[Eventuell kennen manche das aus C++. Objekte werden bei Parameter Übergabe kopiert, wenn nicht anders angegeben. Deswegen ist es in C++ Standard geworden, Objekte von denen man nur bestimmte Daten braucht, als Referenz zu übergeben. Und damit sie Konstant und damit nicht innerhalb dieser Methode/Funktion unglücklicherweise aus Versehen geändert wird, schreiben wir auch const davor. [...]]]></description>
			<content:encoded><![CDATA[<p>Eventuell kennen manche das aus C++.<br />
Objekte werden bei Parameter Übergabe kopiert, wenn nicht anders angegeben. Deswegen ist es in C++ Standard geworden, Objekte von denen man nur bestimmte Daten braucht, als Referenz zu übergeben. Und damit sie Konstant und damit nicht innerhalb dieser Methode/Funktion unglücklicherweise aus Versehen geändert wird, schreiben wir auch const davor.<br />
Etwa so:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="cpp"><pre class="de1"><span class="kw4">void</span> Foo<span class="sy4">::</span><span class="me2">get_something</span><span class="br0">&#40;</span><span class="kw4">const</span> Bar <span class="sy3">&amp;</span> bar<span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
    std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Punkte: &quot;</span> <span class="sy1">&lt;&lt;</span> b.<span class="me1">get_points</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>In D ist es dagegen wie in Java oder C#: Objekte werden Standardmäßig als (Konstante) Referenz übergeben, auch genannt call by reference.<br />
Allerdings nicht so bei Structs. Diese werden wie gewohnt als Kopie übergeben (call by value) und können damit einiges an Speicher und Laufzeit fressen.<br />
Also bietet es sich hier an, wie in C++ zu verfahren und mit Referenzen statt mit Kopien zu arbeiten, um effizientere Programme zu schreiben. Aber wie groß ist eig. der Unterschied in D? Wegen dieser Frage habe ich mir in den letzten Tagen folgendes Benchmark Script geschrieben und diverse Parameter Storage Klassen (<strong>in</strong>*, <strong>out</strong>, <strong>ref</strong>, <strong>const</strong>, <strong>const ref</strong>, <strong>ref const</strong>) getestet, aber auch die normale Übergabe per Kopie.<br />
Dabei ist <code>out</code> als nicht wirklich ernst zunehmender Konkurrent angetreten. Warum? Weil <code>out</code> alles auf die Initialisierungs- bzw Ausgansform zurücksetzt. So auch bei diesem Test, bei dem eigentlich x mal (drei Durchgänge á <strong>500.000</strong>, sowie drei Durchgänge á <strong>100.000</strong>) ein Array eines Struct mit <strong>25.000</strong> Elementen befüllt und dann intern durchgegangen und benutzt wurde.<br />
Mittels <code>out</code> wurde natürlich wieder alles geleert. <code>out</code> kann somit als leerer Vergleich angesehen werden, sprich wie lange das Struct ohne 25.000 Array Elemente gebraucht hätte.</p>
<p>*<em>Mir ist klar, das <code>in</code> nur ein alias für <code>const scope</code> ist, aber es ist hier dennoch der Vollständigkeitshalber &#038; weil mich evtl. auftretende Unterschiede interessierten.</em></p>
<p>Benchmark Script:</p>
<p><a href='http://blog.rswhite.de/archives/556#SID556_1_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p><span id="more-556"></span></p>
<p>Mit <strong>PC</strong> ist fort an mein Heim-PC mit Windows Vista, 32 bit, ca. 3 &#8211; 4 Jahre alt, gemeint.<br />
Mit <strong>Laptop</strong> mein knapp 1 Jahr junger, Windows 7, 64 bit Laptop (Acer TimelineX).</p>
<h2>500.000 Durchläufe á 25.000 Array-Elementen</2></p>
<h3>#1 nicht ausgelastet (Vormittags / PC)</h3>
<blockquote>
<p>normal: timer.Node<br />
Elapsed Time: total: 1137 sec. average: 0.002274 sec.<br />
const: const(timer.Node)<br />
Elapsed Time: total: 1138 sec. average: 0.002276 sec.<br />
in: const(timer.Node)<br />
Elapsed Time: total: 1101.5 sec. average: 0.002203 sec.<br />
ref: timer.Node<br />
Elapsed Time: total: 1098.5 sec. average: 0.002197 sec.<br />
const ref: const(timer.Node)<br />
Elapsed Time: total: 1097 sec. average: 0.002194 sec.<br />
ref const: const(timer.Node)<br />
Elapsed Time: total: 1095.5 average: 0.002191 sec.<br />
out: timer.Node<br />
Elapsed Time: total: 1056 sec. average: 0.002112 sec.</p>
</blockquote>
<p>Daraus ergibt sich folgende Rangliste:</p>
<ol>
<li>out</li>
<li>ref const</li>
<li>const ref</li>
<li>ref</li>
<li>in</li>
<li>normal</li>
<li>const</li>
</ol>
<hr />
<h3>#2 nicht ausgelastet (Nachts / PC)</h3>
<blockquote>
<p>normal: timer.Node<br />
Elapsed Time: total: 1123.109000 sec. average: 0.002246 sec.<br />
const: const(timer.Node)<br />
Elapsed Time: total: 1122.073000 sec. average: 0.002244 sec.<br />
in: const(timer.Node)<br />
Elapsed Time: total: 1123.176000 sec. average: 0.002246 sec.<br />
ref: timer.Node<br />
Elapsed Time: total: 1110.779000 sec. average: 0.002221 sec.<br />
const ref: const(timer.Node)<br />
Elapsed Time: total: 1089.992000 sec. average: 0.002179 sec.<br />
ref const: const(timer.Node)<br />
Elapsed Time: total: 1089.726000 sec. average: 0.002179 sec.<br />
out: timer.Node<br />
Elapsed Time: total: 1043.392000 sec. average: 0.002086 sec.</p>
</blockquote>
<p>Daraus ergibt sich folgende Rangliste:</p>
<ol>
<li>out</li>
<li>ref const</li>
<li>const ref</li>
<li>ref</li>
<li>const</li>
<li>normal</li>
<li>in</li>
</ol>
<p>Hier haben also <code>in</code> und <code>const</code> die Plätze getauscht.</p>
<hr />
<h3>#3 nicht ausgelastet (früh morgens / PC)</h3>
<blockquote>
<p>normal: timer.Node<br />
Elapsed Time: total: 1115.699000 sec. average: 0.002231 sec.<br />
const: const(timer.Node)<br />
Elapsed Time: total: 1119.301000 sec. average: 0.002238 sec.<br />
in: const(timer.Node)<br />
Elapsed Time: total: 1126.902000 sec. average: 0.002253 sec.<br />
ref: timer.Node<br />
Elapsed Time: total: 1083.569000 sec. average: 0.002167 sec.<br />
const ref: const(timer.Node)<br />
Elapsed Time: total: 1090.254000 sec. average: 0.002180 sec.<br />
ref const: const(timer.Node)<br />
Elapsed Time: total: 1091.030000 sec. average: 0.002182 sec.<br />
out: timer.Node<br />
Elapsed Time: total: 1039.632000 sec. average: 0.002079 sec.</p>
</blockquote>
<p>Daraus ergibt sich folgende Rangliste:</p>
<ol>
<li>out</li>
<li>ref</li>
<li>const ref</li>
<li>ref const</li>
<li>normal</li>
<li>const</li>
<li>in</li>
</ol>
<p><code>normal</code> und <code>const</code> getauscht sowie <code>ref</code> und <code>ref const</code>.</p>
<hr />
<h3>nicht ausgelastet (Nachmittags, während des Akku Ladens / Laptop)</h3>
<blockquote>
<p>normal: benchmark.Node<br />
Elapsed Time: total: 1639.904000 sec. average: 0.003279<br />
const: const(benchmark.Node)<br />
Elapsed Time: total: 1653.237000 sec. average: 0.003306<br />
in: const(benchmark.Node)<br />
Elapsed Time: total: 1661.741000 sec. average: 0.003323<br />
ref: benchmark.Node<br />
Elapsed Time: total: 1634.890000 sec. average: 0.003269<br />
const ref: const(benchmark.Node)<br />
Elapsed Time: total: 1650.953000 sec. average: 0.003301<br />
ref const: const(benchmark.Node)<br />
Elapsed Time: total: 1651.356000 sec. average: 0.003302<br />
out: benchmark.Node<br />
Elapsed Time: total: 1551.027000 sec. average: 0.003102</p>
</blockquote>
<p>Daraus ergibt sich folgende Rangliste:</p>
<ol>
<li>out</li>
<li>ref</li>
<li>normal <em>(hier liegt evtl. ein Messungsfehler vor)</em></li>
<li>const ref</li>
<li>ref const</li>
<li>const</li>
<li>in</li>
</ol>
<p>Bis auf den vermutlichen Messungsfehler: deckungsgleich mit PC Messung #2.<br />
Die Laptop Auflistung geht <strong>nicht</strong> in die gesamt Auswertung ein.</p>
<hr />
<p><strong>Zusammengefasst</strong> ergibt sich folgende Rangliste:</p>
<ol>
<li><strong>out</strong> mit 1046.3413 sec. im Durchschnitt</li>
<li><strong>const ref</strong> mit 1092.4153 sec. im Durchschnitt</li>
<li><strong>ref const</strong> mit 1093.0753 sec. im Durchschnitt</li>
<li><strong>ref</strong> mit 1097.616 sec. im Durchschnitt</li>
<li><strong>in</strong> mit 1117.173 sec. im Durchschnitt</li>
<li><strong>normal</strong> mit 1125.27 sec. im Durchschnitt</li>
<li><strong>const</strong> mit 1126.46 sec. im Durchschnitt</li>
</ol>
<hr />
<h2>100.000 Durchläufe á 25.000 Array-Elementen</2></p>
<h3>#1 relativ ausgelastet</h3>
<blockquote>
<p>normal: timer.Node<br />
Elapsed Time: total: 242.059000 sec. average: 0.002420<br />
const: const(timer.Node)<br />
Elapsed Time: total: 243.650000 sec. average: 0.002436<br />
in: const(timer.Node)<br />
Elapsed Time: total: 243.978000 sec. average: 0.002439<br />
ref: timer.Node<br />
Elapsed Time: total: 237.292000 sec. average: 0.002372<br />
const ref: const(timer.Node)<br />
Elapsed Time: total: 236.699000 sec. average: 0.002366<br />
ref const: const(timer.Node)<br />
Elapsed Time: total: 236.697000 sec. average: 0.002366<br />
out: timer.Node<br />
Elapsed Time: total: 226.115000 sec. average: 0.002261
</p></blockquote>
<p>Daraus ergibt sich folgende Rangliste:</p>
<ol>
<li>out</li>
<li>ref const</li>
<li>const ref</li>
<li>ref</li>
<li>normal</li>
<li>const</li>
<li>in</li>
</ol>
<hr />
<h3>#2 kaum ausgelastet</h3>
<blockquote>
<p>normal: timer.Node<br />
Elapsed Time: total: 224.289000 sec. average: 0.002242<br />
const: const(timer.Node)<br />
Elapsed Time: total: 226.320000 sec. average: 0.002263<br />
in: const(timer.Node)<br />
Elapsed Time: total: 228.803000 sec. average: 0.002288<br />
ref: timer.Node<br />
Elapsed Time: total: 219.821000 sec. average: 0.002198<br />
const ref: const(timer.Node)<br />
Elapsed Time: total: 220.465000 sec. average: 0.002204<br />
ref const: const(timer.Node)<br />
Elapsed Time: total: 220.279000 sec. average: 0.002202<br />
out: timer.Node<br />
Elapsed Time: total: 208.562000 sec. average: 0.002085
</p></blockquote>
<ol>
<li>out</li>
<li>ref</li>
<li>ref const</li>
<li>const ref</li>
<li>normal</li>
<li>const</li>
<li>in</li>
</ol>
<p>Hier tauscht zwar keiner, dafür wandert aber <code>ref</code> auf Platz #2.</p>
<hr />
<h3>#3 wenig ausgelastet</h3>
<blockquote>
<p>normal: timer.Node<br />
Elapsed Time: total: 228.251000 sec. average: 0.002282<br />
const: const(timer.Node)<br />
Elapsed Time: total: 227.348000 sec. average: 0.002273<br />
in: const(timer.Node)<br />
Elapsed Time: total: 225.489000 sec. average: 0.002254<br />
ref: timer.Node<br />
Elapsed Time: total: 213.107000 sec. average: 0.002131<br />
const ref: const(timer.Node)<br />
Elapsed Time: total: 219.557000 sec. average: 0.002195<br />
ref const: const(timer.Node)<br />
Elapsed Time: total: 218.884000 sec. average: 0.002188<br />
out: timer.Node<br />
Elapsed Time: total: 209.011000 sec. average: 0.002090</p>
</blockquote>
<ol>
<li>out</li>
<li>ref</li>
<li>ref const</li>
<li>const ref</li>
<li>in</li>
<li>const</li>
<li>normal</li>
</ol>
<p>Hier tauschen <code>in</code> und <code>normal</code> ihre Plätze.</p>
<hr />
<p><strong>Zusammengefasst</strong> ergibt sich folgende Rangliste:</p>
<ol>
<li><strong>out</strong> mit 214.5626 sec. im Durchschnitt</li>
<li><strong>ref</strong> mit 223.406 sec. im Durchschnitt</li>
<li><strong>ref const</strong> mit 225.2866 sec. im Durchschnitt</li>
<li><strong>const ref</strong> mit 225.5736 sec. im Durchschnitt</li>
<li><strong>normal</strong> mit 231.533 sec. im Durchschnitt</li>
<li><strong>const</strong> mit 232.4393 sec. im Durchschnitt</li>
<li><strong>in</strong> mit 232.7566 sec. im Durchschnitt</li>
</ol>
<hr />
<p><strong>Fazit:</strong><br />
Auch wenn es einige Unterschiede zwischen 100.000 und 500.000 Durchläufen gibt, ist wohl der Durchlauf bzw. die drei Durchläufe mit 500.000 am eindeutigsten.<br />
Allerdings sieht man so oder so, dass die Familie der Referenzen (sprich: ref, const ref, ref const) immer an der Spitze stehen, mit erheblichen Unterschieden zu den Restlichen.<br />
Sollte also jmd. ein struct in seinem Programm gebrauchen, sollte er genau darüber nachdenken, wie er damit umgeht.<br />
Wenn man das Struct bisher als Parameter übergab, dessen Eigenschaften auslas, eine neues, geändertes Struct des gleichen Typen daraus generierte und dann zurückgab, sollte man vielleicht von nun an auf Referenzen (ref) zurückgreifen, und die Änderungen an dieser Referenz ausführen (sich das return und damit die lokale Kopie also sparen, und die Laufzeit verringern).<br />
Bsp:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw2">import</span> std.<span class="me1">stdio</span><span class="sy0">;</span>
&nbsp;
<span class="kw4">struct</span> Node <span class="br0">&#123;</span>
	<span class="kw4">int</span><span class="br0">&#91;</span><span class="br0">&#93;</span> array<span class="sy0">;</span>
&nbsp;
	<span class="kw2">this</span><span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">int</span> n<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">uint</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> n<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			array <span class="sy0">~=</span> i<span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw4">void</span> doStuff<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
		<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">int</span> i<span class="sy0">;</span> array<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			writeln<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">void</span> work_with_ref<span class="br0">&#40;</span><span class="kw2">ref</span> Node n<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	n.<span class="me1">array</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="nu0">2</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="nu0">42</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">void</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	Node n <span class="sy0">=</span> Node<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	n.<span class="me1">doStuff</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	work_with_ref<span class="br0">&#40;</span>n<span class="br0">&#41;</span><span class="sy0">;</span>
	n.<span class="me1">doStuff</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Für den Fall, dass man wirklich eine Kopie brauchte, weil an dem Original keine Änderungen geschehen sollten, sollte das ganze dennoch nicht als normaler Parameter übergeben werden, denn auch hier könnte man das Struct als Referenz übergeben (und somit wieder Laufzeit einsparen).<br />
Damit Änderungen per Referenz vermieden werden, sollte man es in diesem Fall (wie wir aus C++ noch wissen) als Konstante Referenz (const ref/rerf const) übergeben.<br />
Nun kann man wie gewohnt fortfahren, hat aber dennoch keine Kopie.<br />
Bsp:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw2">import</span> std.<span class="me1">stdio</span><span class="sy0">;</span>
&nbsp;
<span class="kw4">struct</span> Node <span class="br0">&#123;</span>
	<span class="kw4">int</span><span class="br0">&#91;</span><span class="br0">&#93;</span> array<span class="sy0">;</span>
&nbsp;
	<span class="kw2">this</span><span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">int</span> n<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">uint</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> n<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			array <span class="sy0">~=</span> i<span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw4">void</span> doStuff<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
		<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">int</span> i<span class="sy0">;</span> array<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			writeln<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
Node work_with_const_ref<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw2">ref</span> Node n<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	Node copy <span class="sy0">=</span> Node<span class="br0">&#40;</span>n.<span class="me1">array</span>.<span class="me1">length</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">int</span> i<span class="sy0">,</span> <span class="kw4">const</span> <span class="kw4">int</span> e<span class="sy0">;</span> n.<span class="me1">array</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		copy.<span class="me1">array</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> <span class="br0">&#40;</span>e <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">*</span> <span class="nu0">10</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">return</span> copy<span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">void</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	Node n <span class="sy0">=</span> Node<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="sy0">;</span>
	Node copy <span class="sy0">=</span> work_with_const_ref<span class="br0">&#40;</span>n<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	n.<span class="me1">doStuff</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	copy.<span class="me1">doStuff</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/556/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>D: Array-Extensions</title>
		<link>http://blog.rswhite.de/archives/487</link>
		<comments>http://blog.rswhite.de/archives/487#comments</comments>
		<pubDate>Sat, 28 May 2011 20:02:22 +0000</pubDate>
		<dc:creator>GreenPepper</dc:creator>
				<category><![CDATA[D]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=487</guid>
		<description><![CDATA[Jeder, der mit D anfängt zu programmieren, freut sich über die wunderbaren Array-Funktionen die D von Haus aus mitbringt. Anders wie in C++ bestehen Arrays nämlich nicht mehr einfach aus einem einfachen Datenfeld, sondern beinhalten Informationen über die aktuelle Länge und auch ein paar nützliche Operationen wie den Slice-Operator. Diese Feature sind ja auch schön [...]]]></description>
			<content:encoded><![CDATA[<p>Jeder, der mit D anfängt zu programmieren, freut sich über die wunderbaren Array-Funktionen die D von Haus aus mitbringt. Anders wie in C++ bestehen Arrays nämlich nicht mehr einfach aus einem einfachen Datenfeld, sondern beinhalten Informationen über die aktuelle Länge und auch ein paar nützliche Operationen wie den Slice-Operator.</p>
<p>Diese Feature sind ja auch schön und gut, wären aber noch nicht Grund genug, dass im Phobos-Framework keine einzige Klasse wie vector oder list zu finden sind. Nun ja, der wahre Grund hierfür ist, dass D noch ein weiteres Feature bietet: die sogenannten Array-Extensions. Es handelt sich dabei um Funktionen, die das Array in ihrer Funktionalität erweitert und man gleichzeitig den Eindruck gewinnt, dass die Funktion eine Memberfunktion des Arrays ist. Dabei ist folgende Regel zu beachten: Je allgemeiner man die Funktion implementiert ist, desto mehr Arrays haben die Möglichkeit, die Funktion zu nutzen. Es empfiehlt sich also generisch, sprich mit Templates zu programmieren.<br />
<span id="more-487"></span><br />
Kommen wir nun zum praktischen Teil des Artikels. Bei den ersten Versuchen mit D habe ich eine Funktion vermisst, welche überprüft, ob ein String bzw. ein Array of Char einen Buchstaben bestimmten Buchstaben besitzt. Also habe ich folgende Funktion geschrieben:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">bool</span> contains<span class="br0">&#40;</span><span class="kw4">char</span><span class="br0">&#91;</span><span class="br0">&#93;</span> str<span class="sy0">,</span> <span class="kw4">char</span> c<span class="br0">&#41;</span> <span class="br0">&#123;</span>
   <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="kw4">char</span> item<span class="sy0">;</span> str<span class="br0">&#41;</span> <span class="br0">&#123;</span>
      <span class="kw1">if</span> <span class="br0">&#40;</span>item<span class="sy0">==</span>c<span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span>
   <span class="br0">&#125;</span>
   <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Nun musste ich für die Überprüfung des Array of Char immer diese Funktion aufrufen und ihr als Argument einmal das Array und den Vergleichsparameter übergeben:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">char</span><span class="br0">&#91;</span><span class="br0">&#93;</span> str <span class="sy0">=</span> <span class="st0">&quot;Hallo Welt!&quot;</span><span class="sy0">;</span>
<span class="kw4">bool</span> bContainsY <span class="sy0">=</span> contains<span class="br0">&#40;</span>str<span class="sy0">,</span> <span class="st0">'y'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Das wird auf Dauer zugegebenermaßen ganz schön unübersichtlich. Doch Dank D würde auch folgendes funktionieren:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">char</span><span class="br0">&#91;</span><span class="br0">&#93;</span> str <span class="sy0">=</span> <span class="st0">&quot;Hallo Welt!&quot;</span><span class="sy0">;</span>
<span class="kw4">bool</span> bContainsY <span class="sy0">=</span> str.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">'y'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Man könnte bei dem folgenden Code-Abschnitt also glauben, dass es sich bei str um ein Objekt handelt. In Wirklichkeit aber wird die Funktion contains aufgerufen. <code>str</code> wird der Funktion als erstes Argument, <code>y</code> als zweites Argument übergeben (Im Prinzip arbeiten so auch Klassen, da den Memberoperationen intern der this-Zeiger zugewiesen wird ). Damit man diese Extension auch für andere Arrays verwenden kann, muss man von den Templates Gebrauch machen:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">bool</span> contains<span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#40;</span>T<span class="br0">&#91;</span><span class="br0">&#93;</span> array<span class="sy0">,</span> T com<span class="br0">&#41;</span> <span class="br0">&#123;</span>
   <span class="kw1">foreach</span><span class="br0">&#40;</span>T item<span class="sy0">;</span> array<span class="br0">&#41;</span> <span class="br0">&#123;</span>
      <span class="kw1">if</span> <span class="br0">&#40;</span>item <span class="sy0">==</span> com<span class="br0">&#41;</span> <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span>
   <span class="br0">&#125;</span>
   <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Allerdings sind diese Beispiele eher an D 1.x angelehnt, ein Äquivalentes D 2.x Beispiel wäre so etwas:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">bool</span> contains<span class="br0">&#40;</span>T<span class="sy0">,</span> A<span class="sy0">...</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">in</span> T<span class="br0">&#91;</span><span class="br0">&#93;</span> collection<span class="sy0">,</span> <span class="kw2">in</span> A elements<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">if</span> <span class="br0">&#40;</span>elements.<span class="me1">length</span> <span class="sy0">&gt;</span> collection.<span class="me1">length</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">const</span> T element<span class="sy0">;</span> elements<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span> <span class="br0">&#40;</span>collection.<span class="me1">get_position</span><span class="br0">&#40;</span>element<span class="br0">&#41;</span> <span class="sy0">&amp;</span>lt<span class="sy0">;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">int</span> get_position<span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">in</span> T<span class="br0">&#91;</span><span class="br0">&#93;</span> collection<span class="sy0">,</span> <span class="kw2">in</span> T element<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">if</span> <span class="br0">&#40;</span>collection.<span class="me1">length</span> <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">return</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">uint</span> key<span class="sy0">,</span> <span class="kw4">const</span> T _element<span class="sy0">;</span> collection<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span> <span class="br0">&#40;</span>_element <span class="sy0">==</span> element<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="kw1">return</span> key<span class="sy0">;</span>
		<span class="br0">&#125;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="kw1">return</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">void</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	string<span class="br0">&#91;</span><span class="br0">&#93;</span> names <span class="sy0">=</span> <span class="br0">&#91;</span><span class="st0">&quot;Hans&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Foo&quot;</span><span class="sy0">,</span> <span class="st0">&quot;bar&quot;</span><span class="sy0">,</span> <span class="st0">&quot;quatz&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
	<span class="kw2">assert</span><span class="br0">&#40;</span>names.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;Hans&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw2">assert</span><span class="br0">&#40;</span><span class="sy0">!</span>names.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;Hans&quot;</span><span class="sy0">,</span> <span class="st0">&quot;foo&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw2">assert</span><span class="br0">&#40;</span>names.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;Hans&quot;</span><span class="sy0">,</span> <span class="st0">&quot;Foo&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Achtung: Nicht immer sind diese allgemeinen Extensions erwünscht. Man stelle sich nur vor, dass man Objekte des Types SpaceShuttle in einem Array verwaltet und das Array mit der Funktion saveToFile() erweitern will. Hier Templates zu verwenden würde vollkommen gegen die Logik der generischen Programmierung gehen, da man die Technik zur allgemeinen Programmierung für eine spezifische Funktion benutzen würde.</p>
<p>Doch was ist, wenn man die Referenz des Objektes manipulieren muss, um beispielsweise das Element am Ende des Arrays zu löschen? Richtig, man ändert den  Modifizierer des 1. Parameters in <code>ref</code>:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1">T pushLast<span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">ref</span> T<span class="br0">&#91;</span><span class="br0">&#93;</span> array<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    T tmp<span class="sy0">;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span>array.<span class="me1">length</span> <span class="sy0">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> tmp<span class="sy0">;</span>
    <span class="br0">&#125;</span>
    tmp <span class="sy0">=</span> array<span class="br0">&#91;</span>$<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span>
    array <span class="sy0">=</span> array<span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span>$<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span>
    <span class="kw1">return</span> tmp<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>An der vorherigen Funktionalität ändert sich dabei nichts:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">char</span><span class="br0">&#91;</span><span class="br0">&#93;</span> str <span class="sy0">=</span> <span class="st0">&quot;So la la....&quot;</span><span class="sy0">;</span>
str.<span class="me1">pushLast</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>&nbsp;</p>
<p>Fazit: Die Array-Extensions sind ein sehr nützliches Feature was in 99% aller Fällen eine extra Klasse zu Verwaltung eines Arrays überflüssig macht.</p>
<p>Wer Interesse an einigen nützlichen Funktionen hat, findet diese entweder in der Dgame 1.6 Version oder kann sie sich hier gleich kopieren:</p>
<p><a href='http://blog.rswhite.de/archives/487#SID487_1_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/487/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>D: gleichnamige Methode als Template führt zu Konflikt</title>
		<link>http://blog.rswhite.de/archives/454</link>
		<comments>http://blog.rswhite.de/archives/454#comments</comments>
		<pubDate>Tue, 15 Mar 2011 23:58:50 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[C(++)]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=454</guid>
		<description><![CDATA[Vor ein paar Tagen fiel mir ein Bug oder zumindest ein merkwürdiges Verhalten in D auf. Jeder kennt das nette Feature, dass zwei Methoden den gleichen Namen tragen dürfen, sofern sie sich in ihren Parametern (und/oder return Typ) unterscheiden. Außerdem ist es möglich, das eine der gleich benannten Methoden ein Template ist. Bspw. möchte man [...]]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen fiel mir ein Bug oder zumindest ein merkwürdiges Verhalten in D auf.<br />
Jeder kennt das nette Feature, dass zwei Methoden den gleichen Namen tragen dürfen, sofern sie sich in ihren Parametern (und/oder return Typ) unterscheiden.<br />
Außerdem ist es möglich, das eine der gleich benannten Methoden ein Template ist.<br />
Bspw. möchte man eine Koordinaten oder Rechteck Klasse haben, in der man explizit ein short für einen x oder y Punkt zurückerwartet, aber möchte dem Benutzer das manuelle umcasten von bspw. float in short Werte abnehmen.<br />
Man definiert also eine Template Methode, welche einen impliziten Typ deklariert den man später in der Methode zu short castet (idealerweise nur, wenn es nicht schon ein short ist <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).<br />
<span id="more-454"></span><br />
So könnte der Code aussehen:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="cpp"><ol><li class="li1"><pre class="de1"><span class="co2">#include &lt;iostream&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw2">class</span> Rect <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1"><span class="kw2">public</span><span class="sy4">:</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	Rect<span class="br0">&#40;</span><span class="kw4">short</span> x, <span class="kw4">short</span> y<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		_x <span class="sy1">=</span> x<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">		_y <span class="sy1">=</span> y<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw4">void</span> x<span class="br0">&#40;</span>T x<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		_x <span class="sy1">=</span> <span class="kw2">static_cast</span><span class="sy1">&lt;</span><span class="kw4">short</span><span class="sy1">&gt;</span><span class="br0">&#40;</span>x<span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw4">short</span> x<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw1">return</span> _x<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw2">private</span><span class="sy4">:</span></pre></li><li class="li1"><pre class="de1">	<span class="kw4">short</span> _x, _y<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	Rect r<span class="br0">&#40;</span><span class="nu0">23</span>, <span class="nu0">47</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	r.<span class="me1">x</span><span class="br0">&#40;</span><span class="nu16">4.2</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> r.<span class="me1">x</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Ich hatte genau so etwas nun auch in D geplant:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1"><span class="kw2">import</span> std.<span class="me1">stdio</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw4">class</span> Rect <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1"><span class="kw4">public</span><span class="sy0">:</span></pre></li><li class="li1"><pre class="de1">	<span class="kw2">this</span><span class="br0">&#40;</span><span class="kw2">in</span> <span class="kw4">short</span> x<span class="sy0">,</span> <span class="kw2">in</span> <span class="kw4">short</span> y<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		_x <span class="sy0">=</span> x<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		_y <span class="sy0">=</span> y<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"> 	<span class="kw4">void</span> x<span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">in</span> T x<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		_x <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span><span class="kw4">short</span><span class="br0">&#41;</span> x<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw4">short</span> x<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw1">return</span> _x<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw4">private</span><span class="sy0">:</span></pre></li><li class="li1"><pre class="de1">	<span class="kw4">short</span> _x<span class="sy0">,</span> _y<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw4">void</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	Rect r <span class="sy0">=</span> <span class="kw2">new</span> Rect<span class="br0">&#40;</span><span class="nu0">23</span><span class="sy0">,</span> <span class="nu0">47</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	r.<span class="me1">x</span><span class="br0">&#40;</span><span class="nu16">4.2</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	writeln<span class="br0">&#40;</span>r.<span class="me1">x</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Aber ich erhielt folgenden Fehler:</p>
<blockquote><p>
rect.d(18): Error: function rect.Rect.x conflicts with template rect.Rect.x(T) at rect.d(10)
</p></blockquote>
<p>Es scheint so, als würde die normale nicht-Template Methode mit der Template Methode konkurrieren. Ändert man die Template-Methode zu einer nicht-Template Methode ab</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">void</span> x<span class="br0">&#40;</span><span class="kw4">short</span> x<span class="br0">&#41;</span> <span class="br0">&#123;</span>
	_x <span class="sy0">=</span> x<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Gibt es auch keinen Fehler mehr. Es muss also an der Template Deklaration liegen.<br />
Tja, wie macht man nun einen einigermaßen guten Fix um ein derartiges Feature dennoch zu unterstützen?<br />
Ich habe nested sowie mixin Templates erfolglos probiert und mir fiel schließlich nur eine Lösung ein:<br />
Die nicht-Template Methode muss eine werden:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1">T x<span class="br0">&#40;</span>T <span class="sy0">=</span> <span class="kw4">short</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">return</span> _x<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Wir legen also eine explizite Template Methode an, und weisen dem Template-Typ den <a href="http://www.digitalmars.com/d/2.0/template.html#TemplateTypeParameter">default-Typ</a> &#8220;short&#8221; zu.<br />
Anstelle von short könnte man natürlich auch einfach <code>typeof(_x)</code> schreiben.</p>
<p>Und wie man sieht: es funktioniert.<br />
Wie gesagt, keine Ahnung, ob das so gewollt ist oder nicht, aber mit diesem kleinen &#8220;Hack&#8221; funktioniert es trotzdem.</p>
<p>Als kleine Sicherheit könnte man noch eine explizite if Abfrage in die Methode einbauen, die überprüft, ob es sich bei T, und damit dem Return-Typ, tatsächlich um ein &#8220;short&#8221; handelt:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1">T x<span class="br0">&#40;</span>T <span class="sy0">=</span> <span class="kw4">short</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">is</span><span class="br0">&#40;</span>T <span class="sy0">==</span> <span class="kw4">short</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">return</span> _x<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<h2>Nachtrag</h2>
<p>Nachdem ich <a href="http://www.digitalmars.com/d/archives/digitalmars/D/learn/Template_conflict_with_Function_11175.html">das hier</a> in den Bug-Docs gefunden habe, sollte statt</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1">T x<span class="br0">&#40;</span>T <span class="sy0">=</span> <span class="kw4">short</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">return</span> _x<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>auch so etwas funktionieren</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><pre class="de1"><span class="kw4">short</span> x<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">return</span> _x<span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/454/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to: Templates und Operator Overloading</title>
		<link>http://blog.rswhite.de/archives/398</link>
		<comments>http://blog.rswhite.de/archives/398#comments</comments>
		<pubDate>Sun, 06 Mar 2011 23:35:18 +0000</pubDate>
		<dc:creator>Architekt</dc:creator>
				<category><![CDATA[C(++)]]></category>
		<category><![CDATA[D]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.rswhite.de/?p=398</guid>
		<description><![CDATA[In diesem Artikel möchte ich die Nützlichkeit von Templates (vor allen was Makro Anhänger in C++ angeht) und dem überschreiben von (Arithmetischen) Operatoren in C++ und D zeigen. Ich werde ein bei mir aktuelles Bsp. aufgreifen und dann einen Lösungsweg Stück für Stück in D entwickeln, aber auch den C++ Äquivalent dazu. Vielleicht kennt jemand [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Artikel möchte ich die Nützlichkeit von Templates (vor allen was Makro Anhänger in C++ angeht) und dem überschreiben von (Arithmetischen) Operatoren in C++ und D zeigen.<br />
Ich werde ein bei mir aktuelles Bsp. aufgreifen und dann einen Lösungsweg Stück für Stück in D entwickeln, aber auch den C++ Äquivalent dazu.</p>
<p>Vielleicht kennt jemand das Problem schon:<br />
Angenommen, man hat eine derartige Template Struktur</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1"><span class="kw2">alias</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span><span class="kw4">float</span><span class="br0">&#41;</span> Vector2f<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw2">alias</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span><span class="kw4">short</span><span class="br0">&#41;</span> Vector2s<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw4">struct</span> Vector2<span class="br0">&#40;</span>T<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	T x<span class="sy0">,</span> y<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">this</span><span class="br0">&#40;</span><span class="kw2">in</span> T x<span class="sy0">,</span> <span class="kw2">in</span> T y<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">x</span> <span class="sy0">=</span> x<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">y</span> <span class="sy0">=</span> y<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Und des Weiteren hat man ein Element wie <code>Vector2f v1 = Vector2f(1.5, 2.3);</code> und muss es, aus irgendeinem Grund, in einen <strong>Vector2s</strong> umwandeln/casten.<br />
Wie stellt man das am besten an?<br />
<span id="more-398"></span><br />
Zunächst habe ich versucht den cast operator zu überladen á la</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1">    <span class="kw4">auto</span> opCast<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">        <span class="kw1">return</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span><span class="kw2">cast</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span>x<span class="sy0">,</span> <span class="kw2">cast</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span>y<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>stieß dabei allerdings auf das Problem, dass, sofern ich etwas wie <code>Vector2s v2 = cast(short) v1;</code> machen wollte, eine Fehlermeldung bekam, die mir höflichst andeute, dass, wenn ich schon zu short caste, der Compiler auch einen short und keinen Vector2s zurück erwartet, logisch eigentlich.<br />
Das nächst liegende wie etwa <code>Vector2s v2 = cast(Vector2s) v1;</code> schlug auch Fehl; nun hatte ich zwar den Typ Vector2s, aber wie bekomme ich nun den eigentlichen Typ, sprich short, heraus?<br />
Gar nicht, aber das braucht man auch nicht, wenn an dem Code etwas verändert:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1">E opCast<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">return</span> E<span class="br0">&#40;</span><span class="kw2">this</span>.<span class="me1">x</span><span class="sy0">,</span> <span class="kw2">this</span>.<span class="me1">y</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<h3>Wozu kann man das gebrauchen?</h3>
<p>Damit man z.B. eine <strong>Vector2f</strong> Struktur einfach einer Klasse/Methode übergeben kann, die eine <strong>Vector2s</strong> Struktur erwartet: <code>class.method(cast(Vector2s) v1);</code> ohne das man eine Zwischenvariable anlegen muss.</p>
<p>Aber ich war noch nicht zufrieden.<br />
Ich wandte mich an das <a href="http://www.softchecker.net/upload/index.php">D-Forum</a> und mit entsprechender Hilfe von darkdragon haben wir eine Möglichkeit ausgeklügelt, welche ein casten wie dieses hier erlaubt <code>Vector2s v2 = v1;</code> und ebenso ein leichtes Handling was die Übergabe bzw. somit auch das konvertieren angeht, z.B. <code>Vector2s v3 = Vector2s(3.14, 2.5);</code> oder, wie im obigen Fall beschrieben zur Übergabe einer <strong>Vector2f</strong> Struktur an eine Methode die eig. eine <strong>Vector2s</strong> Struktur erwartet: <code>class.method(Vector2s(v1));</code>.<br />
Im ersteren Fall sieht man deutlich, dass ich hier float Werte übergebe, obwohl man denken würde, dass Vector2s explizit shorts erwartet. Das ist nun aber egal, sie werden beim Aufruf automatisch umgecastet. Bequem und einfach.<br />
Der ganze Zauber beruht auf dem (mehrfachen) überschreiben des opCall <a href="http://www.digitalmars.com/d/2.0/operatoroverloading.html">Operator</a>s. Allerdings dient der <strong>opCall</strong> Operator gleichermaßen als Ersatz für den bisherigen Konstruktor, denn dieser ist mit diesem &#8220;Hack&#8221; &#8211; im Fachjargon <a href="http://de.wikipedia.org/wiki/Metaprogrammierung">Metaprogrammierung</a> genannt &#8211; nicht zulässig; der Compiler meldet einige schwerwiegende Fehler <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Aber wie gesagt, opCall dient als entsprechender und &#8211; in diesem Fall &#8211; sogar besseren Ersatz. Hier der Code:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1"><span class="kw4">public</span> <span class="kw4">struct</span> Vector2<span class="br0">&#40;</span>T<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">    T x<span class="sy0">,</span> y<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="kw4">static</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> opCall<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">in</span> E x<span class="sy0">,</span> <span class="kw2">in</span> E y<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">        Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vec<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">        vec.<span class="me1">x</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> x<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">        vec.<span class="me1">y</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> y<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">        <span class="kw1">return</span> vec<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="kw4">static</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> opCall<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">in</span> E<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> vec<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">        <span class="kw1">return</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#40;</span>vec<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> vec<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="kw4">static</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> opCall<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">in</span> E<span class="br0">&#91;</span><span class="br0">&#93;</span> vec<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw1">if</span> <span class="br0">&#40;</span>vec.<span class="me1">length</span> <span class="sy0">!=</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">throw</span> <span class="kw2">new</span> <span class="kw3">Exception</span><span class="br0">&#40;</span><span class="st0">&quot;vec has not the length of 2&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">        <span class="kw1">return</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#40;</span>vec<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span> vec<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="kw4">static</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> opCall<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw2">ref</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span> vec<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">        T x <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vec.<span class="me1">x</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">        T y <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vec.<span class="me1">y</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">        <span class="kw1">return</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span><span class="br0">&#40;</span>x<span class="sy0">,</span> y<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Weiß jemand, warum die Methoden als static deklariert sein müssen? <img src='http://blog.rswhite.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href='http://blog.rswhite.de/archives/398#SID398_1_tgl' title='Visit blog to check out this spoiler'>Visit blog to check out this spoiler</a></p>
<p>Allerdings geht das noch einfacher, denn D akzeptiert &#8211; <strong>*</strong> genau wie C++ &#8211; Template Konstruktoren und damit werden unsere ganzen opCall&#8217;s überflüssig</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1"><span class="kw4">struct</span> Vector2<span class="br0">&#40;</span>T<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	T x<span class="sy0">,</span> y<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">    <span class="kw2">this</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">in</span> E vx<span class="sy0">,</span> <span class="kw2">in</span> E vy<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">x</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vx<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">y</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vy<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">this</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw2">in</span> E<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span> v<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">x</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> v<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">y</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> v<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">this</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw2">ref</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span> vec<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">x</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vec.<span class="me1">x</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">y</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vec.<span class="me1">y</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	E opCast<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw1">return</span> E<span class="br0">&#40;</span><span class="kw2">this</span>.<span class="me1">x</span><span class="sy0">,</span> <span class="kw2">this</span>.<span class="me1">y</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Wenn man nun etwas wie<br />
<code>Vector2f v1 = Vector2f(3.14, 2.5)</code>;<br />
hat und es in eine bereits bestehende Vector2s Struktur überführen möchte, kann man entweder den <strong>opAssign</strong> Operator überschreiben</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1">	Vector2<span class="sy0">!</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> opAssign<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw2">ref</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span> vec<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">x</span> <span class="sy0">=</span> vec.<span class="me1">x</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">y</span> <span class="sy0">=</span> vec.<span class="me1">y</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">		<span class="kw1">return</span> <span class="kw2">this</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>und kann dann so etwas hier machen:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1">Vector2f v1 <span class="sy0">=</span> Vector2f<span class="br0">&#40;</span><span class="nu16">3.14</span><span class="sy0">,</span> <span class="nu16">2.5</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">Vector2s v2<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="co1">//...</span></pre></li><li class="li1"><pre class="de1">v2 <span class="sy0">=</span> v1<span class="sy0">;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>oder man macht es mittels casting:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1">Vector2f v1 <span class="sy0">=</span> Vector2f<span class="br0">&#40;</span><span class="nu16">3.14</span><span class="sy0">,</span> <span class="nu16">2.5</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">Vector2s v2<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="co1">//...</span></pre></li><li class="li1"><pre class="de1">v2 <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>Vector2s<span class="br0">&#41;</span> v1<span class="sy0">;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Oder aber, man überschreibt den <strong>opCall</strong> Operator erneut:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1">	<span class="kw4">void</span> opCall<span class="br0">&#40;</span>E<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw2">ref</span> Vector2<span class="sy0">!</span><span class="br0">&#40;</span>E<span class="br0">&#41;</span> vec<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">x</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vec.<span class="me1">x</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw2">this</span>.<span class="me1">y</span> <span class="sy0">=</span> <span class="kw2">cast</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span> vec.<span class="me1">y</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>dann könnte man das ganze so in etwa lösen:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="d"><ol><li class="li1"><pre class="de1">Vector2f v1 <span class="sy0">=</span> Vector2f<span class="br0">&#40;</span><span class="nu16">3.14</span><span class="sy0">,</span> <span class="nu16">2.5</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li class="li1"><pre class="de1">Vector2s v2<span class="sy0">;</span></pre></li><li class="li1"><pre class="de1"><span class="co1">//...</span></pre></li><li class="li1"><pre class="de1">v2<span class="br0">&#40;</span>v1<span class="br0">&#41;</span><span class="sy0">;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Je nachdem was einem lieber ist.</p>
<h2>Das C++ Äquivalent</h2>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="cpp"><ol><li class="li1"><pre class="de1"><span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span> </pre></li><li class="li1"><pre class="de1"><span class="kw4">struct</span> Vector2 <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	T x, y<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	Vector2<span class="br0">&#40;</span>T X, T Y<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		x <span class="sy1">=</span> X<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">		y <span class="sy1">=</span> Y<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> E<span class="sy1">&gt;</span></pre></li><li class="li1"><pre class="de1">	Vector2<span class="br0">&#40;</span><span class="kw4">const</span> Vector2<span class="sy1">&lt;</span>E<span class="sy1">&gt;</span> <span class="sy3">&amp;</span> vec<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		x <span class="sy1">=</span> <span class="kw2">static_cast</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span>vec.<span class="me1">x</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">		y <span class="sy1">=</span> <span class="kw2">static_cast</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span>vec.<span class="me1">y</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> E<span class="sy1">&gt;</span></pre></li><li class="li1"><pre class="de1">	Vector2<span class="br0">&#40;</span>E X, E Y<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		x <span class="sy1">=</span> <span class="kw2">static_cast</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span>X<span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">		y <span class="sy1">=</span> <span class="kw2">static_cast</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span>Y<span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> E<span class="sy1">&gt;</span> </pre></li><li class="li1"><pre class="de1">	Vector2<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> operator <span class="sy1">=</span><span class="br0">&#40;</span><span class="kw4">const</span> Vector2<span class="sy1">&lt;</span>E<span class="sy1">&gt;</span> <span class="sy3">&amp;</span> vec<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw1">return</span> Vector2<span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span><span class="kw2">static_cast</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span>vec.<span class="me1">x</span><span class="br0">&#41;</span>, <span class="kw2">static_cast</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span>vec.<span class="me1">y</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> E<span class="sy1">&gt;</span></pre></li><li class="li1"><pre class="de1">	Vector2<span class="sy1">&lt;</span>E<span class="sy1">&gt;</span> cast<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		<span class="kw1">return</span> Vector2<span class="sy1">&lt;</span>E<span class="sy1">&gt;</span><span class="br0">&#40;</span><span class="kw2">static_cast</span><span class="sy1">&lt;</span>E<span class="sy1">&gt;</span><span class="br0">&#40;</span>x<span class="br0">&#41;</span>, <span class="kw2">static_cast</span><span class="sy1">&lt;</span>E<span class="sy1">&gt;</span><span class="br0">&#40;</span>y<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span><span class="sy4">;</span></pre></li></ol></div></div></div></div></div></div></div>


<p>Und die Anwendung:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="cpp"><ol><li class="li1"><pre class="de1"><span class="kw4">typedef</span> Vector2<span class="sy1">&lt;</span><span class="kw4">float</span><span class="sy1">&gt;</span> Vector2f<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1"><span class="kw4">typedef</span> Vector2<span class="sy1">&lt;</span><span class="kw4">short</span><span class="sy1">&gt;</span> Vector2s<span class="sy4">;</span> </pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	Vector2f v1 <span class="sy1">=</span> Vector2f<span class="br0">&#40;</span><span class="nu16">3.14</span>, <span class="nu16">2.5</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> v1.<span class="me1">x</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;:&quot;</span> <span class="sy1">&lt;&lt;</span> v1.<span class="me1">y</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	Vector2s v2 <span class="sy1">=</span> v1.<span class="me1">cast</span><span class="sy1">&lt;</span><span class="kw4">short</span><span class="sy1">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> v2.<span class="me1">x</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;:&quot;</span> <span class="sy1">&lt;&lt;</span> v2.<span class="me1">y</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Der Hack&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	Vector2s v3 <span class="sy1">=</span> v1<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> v3.<span class="me1">x</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;:&quot;</span> <span class="sy1">&lt;&lt;</span> v3.<span class="me1">y</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


<h2>Anhang</h2>
<p><strong>*</strong> Template Konstruktoren</p>
<p>Die C++ Variante:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="cpp"><ol><li class="li1"><pre class="de1"><span class="co2">#include &lt;iostream&gt;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span></pre></li><li class="li1"><pre class="de1"><span class="kw2">class</span> Foo <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	<span class="kw2">public</span><span class="sy4">:</span></pre></li><li class="li1"><pre class="de1">		T value<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	Foo<span class="br0">&#40;</span>T v<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		value <span class="sy1">=</span> v<span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1">	<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> E<span class="sy1">&gt;</span></pre></li><li class="li1"><pre class="de1">	Foo<span class="br0">&#40;</span>E v<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">		value <span class="sy1">=</span> <span class="kw2">static_cast</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span>v<span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	<span class="br0">&#125;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">&nbsp;</pre></li><li class="li1"><pre class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li class="li1"><pre class="de1">	Foo<span class="sy1">&lt;</span><span class="kw4">short</span><span class="sy1">&gt;</span> f1 <span class="sy1">=</span> Foo<span class="sy1">&lt;</span><span class="kw4">short</span><span class="sy1">&gt;</span><span class="br0">&#40;</span><span class="nu0">42</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> f1.<span class="me1">value</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	Foo<span class="sy1">&lt;</span><span class="kw4">short</span><span class="sy1">&gt;</span> f2 <span class="sy1">=</span> Foo<span class="sy1">&lt;</span><span class="kw4">short</span><span class="sy1">&gt;</span><span class="br0">&#40;</span><span class="nu16">3.14</span><span class="br0">&#41;</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1">	std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> f2.<span class="me1">value</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span></pre></li><li class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li></ol></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://blog.rswhite.de/archives/398/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

