<?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[&#x2F;&#x2F;designfrage - sowas wie traits für enums...]]></title><description><![CDATA[<p>Blöder threadtirwl, sorry.<br />
Ich habe das Problem, dass ich in meinem Programm eine Klasse hat, die einen Model-Parameter besitzt, den sie für alles mögliche benötigt.<br />
Zudem ist von diesem z.B. in einer Hilfsklasse der &quot;Template-Parameter abhängig:</p>
<pre><code class="language-cpp">namespace XXX
{
   enum MODEL { A, B, C };
}

class ModuleA {};
class ModuleB {};
class ModuleC {};

class Klasse : public Basis
public:
  void virtualFoo()
  {
     switch(this-&gt;model){
     case XXX::A: this-&gt;foo&lt;ModuleA&gt;();
     case XXX::B: this-&gt;foo&lt;ModuleD&gt;();
     case XXX::C: this-&gt;foo&lt;ModuleC&gt;();
     default: throw exception(...);
  }
  template&lt; typename ModelModule &gt;
  void foo()
  {
      ...
      xyz = new blabla&lt; ModelModule  &gt;;
      ...
  }
};
</code></pre>
<p>Diese switch-Anweisung ist sehr unschön und gerade bei neuen Modellen bekommt man erst zur Laufzeit die Infor, dass Fälle nicht abgefangen wurden. Aber es MUSS eh für jedes Modell ein Modul vorhanden sein, andernfalls sollte der Compiler bereits streiken.<br />
Ich dachte hier an Traits. Sowas wie</p>
<pre><code class="language-cpp">void virtualFoo()
{
  this-&gt;foo&lt; Traits&lt; this-&gt;model &gt;::ModelModule &gt;();
}
</code></pre>
<p>Doch das geht für enums ja nicht. Hat da jemand eine Idee?<br />
SirAnn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206702/designfrage-sowas-wie-traits-für-enums</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 06:11:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206702.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Feb 2008 18:48:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &#x2F;&#x2F;designfrage - sowas wie traits für enums... on Wed, 27 Feb 2008 18:48:01 GMT]]></title><description><![CDATA[<p>Blöder threadtirwl, sorry.<br />
Ich habe das Problem, dass ich in meinem Programm eine Klasse hat, die einen Model-Parameter besitzt, den sie für alles mögliche benötigt.<br />
Zudem ist von diesem z.B. in einer Hilfsklasse der &quot;Template-Parameter abhängig:</p>
<pre><code class="language-cpp">namespace XXX
{
   enum MODEL { A, B, C };
}

class ModuleA {};
class ModuleB {};
class ModuleC {};

class Klasse : public Basis
public:
  void virtualFoo()
  {
     switch(this-&gt;model){
     case XXX::A: this-&gt;foo&lt;ModuleA&gt;();
     case XXX::B: this-&gt;foo&lt;ModuleD&gt;();
     case XXX::C: this-&gt;foo&lt;ModuleC&gt;();
     default: throw exception(...);
  }
  template&lt; typename ModelModule &gt;
  void foo()
  {
      ...
      xyz = new blabla&lt; ModelModule  &gt;;
      ...
  }
};
</code></pre>
<p>Diese switch-Anweisung ist sehr unschön und gerade bei neuen Modellen bekommt man erst zur Laufzeit die Infor, dass Fälle nicht abgefangen wurden. Aber es MUSS eh für jedes Modell ein Modul vorhanden sein, andernfalls sollte der Compiler bereits streiken.<br />
Ich dachte hier an Traits. Sowas wie</p>
<pre><code class="language-cpp">void virtualFoo()
{
  this-&gt;foo&lt; Traits&lt; this-&gt;model &gt;::ModelModule &gt;();
}
</code></pre>
<p>Doch das geht für enums ja nicht. Hat da jemand eine Idee?<br />
SirAnn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464284</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 27 Feb 2008 18:48:01 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;designfrage - sowas wie traits für enums... on Wed, 27 Feb 2008 19:34:45 GMT]]></title><description><![CDATA[<p>Guck dir mal das strategy-pattern an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464314</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 Feb 2008 19:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;designfrage - sowas wie traits für enums... on Sun, 09 Mar 2008 12:09:37 GMT]]></title><description><![CDATA[<p>okay. hi erbin ich wieder. ja, strategy ist ne feine sache. allerdings ist hier komposition statt vererbung nur ein weiterer aspekt, den man berücksichtigen koennte, der aber nicht das problem löst.</p>
<p>daher zum eigentlichen problem:</p>
<p>die <strong>Klasse</strong> ist bereits ein Strategie-Modul.<br />
um genau zu sein ist dieses Modul zum setzen von <strong>connectoren</strong> zwischen konkreten blöcken in einem strömungssimulator bestimmt.<br />
der je nach simulator-modell kann dieses modul sich unterscheiden. zudem ist ein weiterer parameter der typ des <strong>connectors</strong>. natürlich kann man jetzt für jede kombination von modell, connector und connector typ eine weitere strategie implementieren. der code für das setzen dieser <strong>connectoren</strong> ist jedoch relativ komplex und zudem immer derselbe -&gt; jede menge redundanter quellcode -&gt; templates bieten sich an</p>
<p>das einzige problem, dass ich habe ist, dass der tatsächliche typ erst zur laufzeit herausstellt und eben ein enum ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
<p>stark vereinfacht:</p>
<pre><code class="language-cpp">void setzeConnectors() //&lt;-überschriebene virtuelle Methode -&gt; interface nicht änderbar
{
    if     (this-&gt;model == A) this-&gt;setzeConnectors&lt; connector1A, connector2A &gt;();
    else if(this-&gt;model == B) this-&gt;setzeConnectors&lt; connector1B, connector2B &gt;
    ...
}
template&lt; typename conn1, typename conn2 &gt;
void setzeConnectors()
{
   //300 Zeilen quellcode mit einzigem unterschied:
   //block-&gt;setzeConn( conn1() ); etc. pp.
}
</code></pre>
<p>eigentlich dachte ich daran, dass ich für jeden modell typ ein odere mehrere traits erstellte, die dann verwendet werden. aber dann muesste <strong>Klasse</strong> eine template Klasse sein. und gerade das möchte ich verhindern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470920</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Sun, 09 Mar 2008 12:09:37 GMT</pubDate></item></channel></rss>