<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Entwurfsmuster gesucht: Werte-Initialisierung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe öfter die Situation, dass ich eine Klasse mit vielen Werten bestücken muss. Dafür suche ich ein Codemuster.</p>
<p>Um das ganze zu illustrieren, zwei Beispiele:</p>
<p>* Ich habe eine 'matrix'-Klasse, welche eine Abbildung K x K -&gt; V vornimmt, d.h. für generische K zwei Parameter auf einen Wert abbildet. Die Menge der Schlüssel wird im Konstruktor initialisiert. Da ich dem Nutzer die Wahl der Eingabe lassen wollte, habe ich das mit Iteratoren gemacht:</p>
<pre><code class="language-cpp">matrix::matrix(FIter begin, FIter end) { std::copy(begin, end, back_inserter(m_keys)); }
</code></pre>
<p>Das konnte man dann folgendermaßen aufrufen:</p>
<pre><code class="language-cpp">char keys[] = { 'A', 'C', 'G', 'T' };
matrix&lt;char, int, 4&gt; m(keys, keys + 4);
</code></pre>
<p>Diese Matrix würde also Nucleinsäurebasen als Schlüssel verwenden. Das ist umständlich, aber es geht.</p>
<p>* Für eine Klasse zum Abbilden von Status (eine FSM für ein hidden Markov model) benötige ich eine Menge von Ausgaben (&quot;emission&quot; oder &quot;observation&quot;, Beobachtung) zusammen mit ihren relativen Wahrscheinlichkeiten. Hierfür habe ich eine &quot;builder style&quot; Initialiserungsliste gewählt, weil ich denke, dass das die wenigste Schreibarbeit ist. Das sieht dann z.B. so aus:</p>
<pre><code class="language-cpp">state&lt;int&gt; loaded;
double const u = 1.0 / 10.0;
double const uu = 1.0 / 2.0;

loaded.emit(1, u).emit(2, u).emit(3, u).emit(4, u).emit(5, u).emit(6, uu);
</code></pre>
<p>Wie man leicht erraten kann, gibt 'emit' eine Referenz auf '*this' zurück.<br />
Hier wird ein gezinkter Würfel modelliert, der mit erhöhter Wahrscheinlichkeit eine 6 würfelt.</p>
<p>Ich bin nun mit dieser Art der Initialisierung irgendwie unzufrieden. Es muss doch irgendein einheitliches Muster geben, das einen große Mengen an Daten initialisieren lässt. Könnte mir bitte jemand helfen? Ich sammle auch allgemein Vorschläge, auch wenn es sich dabei nicht um etablierte Entwurfsmuster handelt -- ich brauche einfach eine konzise Kurzschreibweise, die wiederverwendbar ist.</p>
<p>Die in boost::Spirit gewählte Art der Initialisierung von Listen (also m.keys = 'A', 'C', 'G', 'T') mag ich allerdings nicht, da der Operator &quot;,&quot; in C++ für mich anders belegt ist (außerdem ist mir das zuviel Schreibaufwand, dafür einen Handler zu implementieren).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167566/entwurfsmuster-gesucht-werte-initialisierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 00:33:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167566.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Dec 2006 15:17:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Entwurfsmuster gesucht: Werte-Initialisierung on Tue, 12 Dec 2006 15:17:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe öfter die Situation, dass ich eine Klasse mit vielen Werten bestücken muss. Dafür suche ich ein Codemuster.</p>
<p>Um das ganze zu illustrieren, zwei Beispiele:</p>
<p>* Ich habe eine 'matrix'-Klasse, welche eine Abbildung K x K -&gt; V vornimmt, d.h. für generische K zwei Parameter auf einen Wert abbildet. Die Menge der Schlüssel wird im Konstruktor initialisiert. Da ich dem Nutzer die Wahl der Eingabe lassen wollte, habe ich das mit Iteratoren gemacht:</p>
<pre><code class="language-cpp">matrix::matrix(FIter begin, FIter end) { std::copy(begin, end, back_inserter(m_keys)); }
</code></pre>
<p>Das konnte man dann folgendermaßen aufrufen:</p>
<pre><code class="language-cpp">char keys[] = { 'A', 'C', 'G', 'T' };
matrix&lt;char, int, 4&gt; m(keys, keys + 4);
</code></pre>
<p>Diese Matrix würde also Nucleinsäurebasen als Schlüssel verwenden. Das ist umständlich, aber es geht.</p>
<p>* Für eine Klasse zum Abbilden von Status (eine FSM für ein hidden Markov model) benötige ich eine Menge von Ausgaben (&quot;emission&quot; oder &quot;observation&quot;, Beobachtung) zusammen mit ihren relativen Wahrscheinlichkeiten. Hierfür habe ich eine &quot;builder style&quot; Initialiserungsliste gewählt, weil ich denke, dass das die wenigste Schreibarbeit ist. Das sieht dann z.B. so aus:</p>
<pre><code class="language-cpp">state&lt;int&gt; loaded;
double const u = 1.0 / 10.0;
double const uu = 1.0 / 2.0;

loaded.emit(1, u).emit(2, u).emit(3, u).emit(4, u).emit(5, u).emit(6, uu);
</code></pre>
<p>Wie man leicht erraten kann, gibt 'emit' eine Referenz auf '*this' zurück.<br />
Hier wird ein gezinkter Würfel modelliert, der mit erhöhter Wahrscheinlichkeit eine 6 würfelt.</p>
<p>Ich bin nun mit dieser Art der Initialisierung irgendwie unzufrieden. Es muss doch irgendein einheitliches Muster geben, das einen große Mengen an Daten initialisieren lässt. Könnte mir bitte jemand helfen? Ich sammle auch allgemein Vorschläge, auch wenn es sich dabei nicht um etablierte Entwurfsmuster handelt -- ich brauche einfach eine konzise Kurzschreibweise, die wiederverwendbar ist.</p>
<p>Die in boost::Spirit gewählte Art der Initialisierung von Listen (also m.keys = 'A', 'C', 'G', 'T') mag ich allerdings nicht, da der Operator &quot;,&quot; in C++ für mich anders belegt ist (außerdem ist mir das zuviel Schreibaufwand, dafür einen Handler zu implementieren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190689</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 12 Dec 2006 15:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to Entwurfsmuster gesucht: Werte-Initialisierung on Tue, 12 Dec 2006 16:09:28 GMT]]></title><description><![CDATA[<p>du könntest eine emiterklasse schreiben, und dann folgenden code nutzen</p>
<pre><code class="language-cpp">loaded.emitter()(1,u)(2,u)(3,u)(4,u)(5,u)(6,uu);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1190715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190715</guid><dc:creator><![CDATA[ronny]]></dc:creator><pubDate>Tue, 12 Dec 2006 16:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Entwurfsmuster gesucht: Werte-Initialisierung on Tue, 12 Dec 2006 17:49:13 GMT]]></title><description><![CDATA[<p>Hi r0nny,</p>
<p>das ist eine Lösung. Allerdings hat sie ein Problem, das auch die boost-Lösung hat: Man muss einen Proxy schreiben. Na ja, schlimmstenfalls mache ich das auch noch, besser als nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190775</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Tue, 12 Dec 2006 17:49:13 GMT</pubDate></item></channel></rss>