<?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[Template Method Pattern anstatt if-else?]]></title><description><![CDATA[<p>Hallo,</p>
<p>bevor ich meine Frage stelle:<br />
* Ich habe einiges gelesen unter google und habe die Sufu benutzt,<br />
allerdings verstehe ich das Prinzip immer und immer noch nicht.<br />
* Ich bin mit Templates bisher erst seit kurzem in Kontakt gekommen</p>
<p>Es geht um folgendes:<br />
Wenn ich ein Programm habe, das auch korrekt läuft. Jetzt will ich eine Optimierung einbauen, z.B die Benutzung eines hash-tables. Dies will ich aber frei wählbar machen, also z.B über ein input-flag an und ausschaltbar machen.<br />
Jetzt habe ich es bisher so gemacht, dass ich entweder alles in die Methode hinzugefügt habe und mit vielen if-else abgefragt habe.<br />
Oder ich dupliziere den code der Methode und springe schon von Beginn nach nur einem if-else in die korrekte Submethode. Könnte man auch über ein switch-statement realisieren.<br />
Für immer mehr Optimierungen führt das aber zu einem Wirrwarr.</p>
<p>Jetzt habe ich zum ersten mal was &quot;gehört&quot;, dass es irgendwie über Template Methods gehen soll bzw. Template-Method-Pattern. Dazu muss man irgendwie mit virtuall umgehen können, was ich bis jetzt nicht kann.</p>
<p>Es würde mir Helfen wenn mir jemand einen einfachen Pseudocode hinschreiben könnte der mittels der gerade besagten Funktionalität arbeitet. So sollte man angeblich nur einmal code schreiben müssen? Stimmt das?</p>
<p>Für eure geduldige Hilfe bin ich dankbar</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194257/template-method-pattern-anstatt-if-else</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 11:32:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194257.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Oct 2007 15:09:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 15:51:19 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>bevor ich meine Frage stelle:<br />
* Ich habe einiges gelesen unter google und habe die Sufu benutzt,<br />
allerdings verstehe ich das Prinzip immer und immer noch nicht.<br />
* Ich bin mit Templates bisher erst seit kurzem in Kontakt gekommen</p>
<p>Es geht um folgendes:<br />
Wenn ich ein Programm habe, das auch korrekt läuft. Jetzt will ich eine Optimierung einbauen, z.B die Benutzung eines hash-tables. Dies will ich aber frei wählbar machen, also z.B über ein input-flag an und ausschaltbar machen.<br />
Jetzt habe ich es bisher so gemacht, dass ich entweder alles in die Methode hinzugefügt habe und mit vielen if-else abgefragt habe.<br />
Oder ich dupliziere den code der Methode und springe schon von Beginn nach nur einem if-else in die korrekte Submethode. Könnte man auch über ein switch-statement realisieren.<br />
Für immer mehr Optimierungen führt das aber zu einem Wirrwarr.</p>
<p>Jetzt habe ich zum ersten mal was &quot;gehört&quot;, dass es irgendwie über Template Methods gehen soll bzw. Template-Method-Pattern. Dazu muss man irgendwie mit virtuall umgehen können, was ich bis jetzt nicht kann.</p>
<p>Es würde mir Helfen wenn mir jemand einen einfachen Pseudocode hinschreiben könnte der mittels der gerade besagten Funktionalität arbeitet. So sollte man angeblich nur einmal code schreiben müssen? Stimmt das?</p>
<p>Für eure geduldige Hilfe bin ich dankbar</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1377993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1377993</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 04 Oct 2007 15:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 16:09:54 GMT]]></title><description><![CDATA[<p>Eins vorweg, das <em><a href="http://en.wikipedia.org/wiki/Template_method_pattern" rel="nofollow">Template Method Pattern</a></em> hat nichts mit C++ templates zu tun.</p>
<p>Aber ist vielleicht trotzdem das richtige für dich. Oder vielleicht auch nicht, schwer zu sagen ohne näheres zu wissen.</p>
<p>Wenn es verschiedene, orthogonale Punkte gibt, böte sich das <a href="http://en.wikipedia.org/wiki/Strategy_pattern" rel="nofollow">Strategy Pattern</a> vielleicht eher an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378034</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Thu, 04 Oct 2007 16:09:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 16:39:53 GMT]]></title><description><![CDATA[<p>hmm....<br />
ok das mit den templates das seh ihc jetzt natürlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> hat damit nix zu tun.</p>
<p>Vielleicht versuche ich mein vorhaben auf einem minimalbeispiel, das nur pseudocode ist und gar nichts macht. Es geht mir nur ums Prinzip:</p>
<pre><code class="language-cpp">// in der main:

class1.my_algorithm();

//class1

void class1::my_algorithm(input_param)
{
      if (input_param == true)
          b = berechne_b();
      else
          b = 0;

      a = berechne_a(b);

      funktion_b(a);
      //....
}
</code></pre>
<p>dieses könnte man natürlich auch über ein switch-statement schreiben oder so machen:</p>
<pre><code class="language-cpp">// in der main:

if (input_param)
    class1.my_algorithm_a();
else
    class1.my_algorithm_b();

//class1

void class1::my_algorithm_a()
{

      b = 0;
      a = berechne_a(b);
      funktion_b(a);
      //....
}

void class1::my_algorithm_b()
{

      b = berechne_b();
      a = berechne_a(b);
      funktion_b(a);
      //....
}
</code></pre>
<p>nur würde ich beides gerne vermeiden - geht das mit template methods?</p>
<p>Aber auch wenn ich das strategy pattern einsetze - irgendwo MUSS ja ein switch oder if-else statement rein oder nicht? Weil nur so kann ich ja Klassenspezifisch die Methode aufrufen.... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378038</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 04 Oct 2007 16:39:53 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 17:17:43 GMT]]></title><description><![CDATA[<p>Template Method Pattern:</p>
<pre><code class="language-cpp">class class1
{
public:
  void my_algorithm()
  {
    b = berechne_b();
    a = berechne_a(b);
    funktion_b(a);
  }

protected:
  virtual int berechne_b() = 0;
  virtual int berechne_a() = 0;
  virtual void funktion_b() = 0;
};

class class1_variante1 : public class1
{
protected:
  virtual int berechne_b() { return 0; }
  // etc.
};

class class1_variante2 : public class1
{
  virtual int berechne_b() { return berechnung_von_b(); }
  // etc.
};

class1* make_class1( bool input_param )
{
  if (input_param) // (input_param == true) ist so sinnvoll wie (((((input_param == true) == true) ... )))
    return new class1_variante1;
  else
    return new class1_variante2;
};
</code></pre>
<p>Strategy Pattern:</p>
<pre><code class="language-cpp">struct b_berechner
{
  virtual int berechne() = 0;
};

struct b_berechner_variante1
{
  virtual int berechne() { return 0; }
};

struct b_berechner_variante2
{
  virtual int berechne() { return berechnung_von_b(); }
};

class class1
{
public:
  class1( b_berechner* b ) : b_berechner_(b) { }

  void my_algorithm()
  {
    b = b_berechner_-&gt;berechne();
    a = berechne_a(b);
    funktion_b(a);
  }

private:
  b_berechner*  b_berechner_;  
};

class1* make_class1( bool input_param )
{
  if (input_param)
    return new class1(new b_berechner_variante1));
  else
    return new class1(new b_berechner_variante2));
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1378060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378060</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Thu, 04 Oct 2007 17:17:43 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 18:20:10 GMT]]></title><description><![CDATA[<p>Danke vielmals ! Ich habe nun das Template Pattern fast eingebaut - nur ich bleibe an einer stelle irgendwie hängen.</p>
<p>Mein compiler-fehler lautet:</p>
<pre><code>main.cpp:147: Fehler: Variable »o_class« kann nicht als vom abstrakten Typ »Class_Base&lt;double&gt;« deklariert werden
Class_Base.h:46: Anmerkung:   denn die folgenden virtuellen Funktionen sind rein innerhalb »Class_Base&lt;double&gt;«:
Class_Base.h:81: Anmerkung:      void Class_Base&lt;T&gt;::test() [with T = double]
</code></pre>
<p>mein code sieht so aus:</p>
<pre><code class="language-cpp">//in der main:
Class_Base&lt;double&gt;	o_class;
if ( a )
					{

						 o_class = C&lt;double&gt;();

					}
					else
					{
                                             // kommt noch
					}
					o_class.my_algorithm();
</code></pre>
<p>und die Klassen</p>
<pre><code class="language-cpp">#ifndef GUARD_C_H
#define GUARD_C_H

#include &quot;Class_Base.h&quot;
#include &lt;iostream&gt;

template &lt;class T&gt;
class C : public Class_Base&lt;T&gt;
{
	public:
// 		C&lt;T&gt;() { };
// 		~C&lt;T&gt;() { };

	private:

	protected:
		virtual void test() {std::cout &lt;&lt; &quot;C&quot; &lt;&lt; std::endl;}
};

#endif
</code></pre>
<p>und meine Base-class:</p>
<pre><code class="language-cpp">#ifndef GUARD_Class_BASE_H
#define GUARD_Class_BASE_H

template &lt;class T&gt;
class Class_Base
{

	public:		
		virtual ~Class_Base() {};

		void		my_Algorithm();

	private:

	protected:
		virtual void test() = 0;
};

#include &quot;Class_Base.imp&quot;

#endif
</code></pre>
<p>Kann mir jemand sagen warum?<br />
Sobald ich das = 0 wegnehme kommt die fehlermeldung:</p>
<pre><code>undefined reference to `Class_Base&lt;double&gt;::test()'
</code></pre>
<p>EDIT:<br />
Anscheinend (für mich neu) darf ich nicht die Abstrakte-Klasse initialisieren sondern nur die Klasse C. Dann gehts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378082</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 04 Oct 2007 18:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 19:43:18 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>...nur ich bleibe an einer stelle irgendwie hängen.</p>
<p>... Variable ... kann nicht als vom abstrakten Typ ... deklariert werden</p>
<p>EDIT:<br />
Anscheinend (für mich neu) darf ich nicht die Abstrakte-Klasse initialisieren sondern nur die Klasse C. Dann gehts.</p>
</blockquote>
<p>Ja, damit liegst du richtig. Abstrakte Typen sind im wesentlichen nur Schnittstellenzusicherungen. Man kann nur Zeiger des abstrakten Basistyps verwenden um auf beliebige davon abgeleitete Klassen zu verweisen. Eine Initialisierung über den Typ wäre auch wenig sinnvoll, besitzt der doch keine Funktionalität.</p>
<p>Nur mittels des Zeigers kannst du auch einen Algorithmus zur Programmlaufzeit ändern. Mit einer &quot;normalen&quot; Variable bist du auf den Typ festgelegt.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378167</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 04 Oct 2007 19:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 21:06:09 GMT]]></title><description><![CDATA[<p>Kann denn die Unterscheidungs-methode in der abstrakten Klasse untergebracht werden? Eher weniger oder ? Weil sonst gibts ja nen include-kreis oder so...?</p>
<pre><code class="language-cpp">class1* make_class1( bool input_param )
{
  if (input_param)
    return new class1(new b_berechner_variante1));
  else
    return new class1(new b_berechner_variante2));
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1378205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378205</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 04 Oct 2007 21:06:09 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 21:36:24 GMT]]></title><description><![CDATA[<p>Doch, natürlich. Je nach dem was dir konkret vorschwebt ist das entweder sinnvoll oder kontraproduktiv.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378215</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Thu, 04 Oct 2007 21:36:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 21:42:38 GMT]]></title><description><![CDATA[<p>Hmm naja, ich will einfach nur ein switch - statement einbauen um mir halt den Pointer zurückzugeben.</p>
<p>Also praktich diese Methode:</p>
<pre><code class="language-cpp">class1* make_class1( bool input_param )
{
  if (input_param) // (input_param == true) ist so sinnvoll wie (((((input_param == true) == true) ... )))
    return new class1_variante1;
  else
    return new class1_variante2;
};
</code></pre>
<p>In die Abstrakte Klasse setzen.</p>
<p>Nur bekomme ich das so nicht hin.</p>
<p>Meine header sehen so aus:</p>
<pre><code class="language-cpp">//Class_Base
//hier will ich die Header Class_Variante1 und Class_Variante2 einfügen aber 
// es will nicht.
#include &quot;Class_Variante1&quot;
#include &quot;Class_Variante2&quot;

class Class_Base
{
    public:
       Class_Base*   get(int opt) 
        {
                switch(opt)
                 {
                         case 0:
                               return new Class_Variante1();
                         case 1:
                               return new Class_Variante2();
                 }
         }
}

//Class_Variante1
#include &quot;Class_Base&quot;

class Class_Variante1 : public Class_Base
{...};

//Class_Variante2
#include &quot;Class_Base&quot;

class Class_Variante2 : public Class_Base
{...};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1378217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378217</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 04 Oct 2007 21:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Thu, 04 Oct 2007 21:54:59 GMT]]></title><description><![CDATA[<p>Die abgeleiteten Klassen können nicht definiert werden, bevor die Basisklasse bekannt ist. Für die Konstruktion eines Objektes brauchst du aber die vollständige Definition. Folglich kannst du die Erzeugungsmethode mit den new-Aufrufen nicht direkt im Klassenkörper definieren, sondern nur außerhalb (nachdem die abgeleiteten Klassen definiert wurden).<br />
Praktisch also im cpp-File. Das ist auch von den Abhängigkeiten her sinnvoller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378220</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 04 Oct 2007 21:54:59 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 09:29:02 GMT]]></title><description><![CDATA[<p>Finix,</p>
<p>du sagst, das TMP habe nichts mit Templates zu tun und gehst dann dazu über, mit virtuellen Funktionen um Dich zu schmeißen. Da muss ich Einspruch erheben, denn das TMP lässt sich natürlich vorzüglich mit Templates umsetzen – und in C++ würde ich im Zweifelsfall immer diese Methode verwenden, statt virtueller Funktionen.</p>
<p>Dass diese Methode in einem Thread im C++-Forum nicht einmal erwähnt wird, finde ich schade.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378407</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 05 Oct 2007 09:29:02 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 11:03:29 GMT]]></title><description><![CDATA[<p>Also mich würde brennend interessieren wie das über Templates realisierbar wäre Konrad. Könntest Du vielleicht den vorig geposteten Beispielcode (so schlimm er auch ist) evtl. über Templates ins TMP packen?</p>
<p>Und was ist der Grund warum über Templates das TMP &quot;besser&quot; ist als über virtuelle Funktionen ?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a>:</p>
<blockquote>
<p>Praktisch also im cpp-File. Das ist auch von den Abhängigkeiten her sinnvoller.</p>
</blockquote>
<p>wenn ich gleichzeitig mit Templates arbeite - ist das dan auch möglich?<br />
Weil sowas in ne cpp-zu schreiben geht ja net:</p>
<pre><code class="language-cpp">template &lt;class T&gt;	Class_Base&lt;T&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm(const int opt_level)
{
	switch(opt_level)
	{
		case no_opt:
			return new C1&lt;T&gt;();
		case opt_1:
			return new C2&lt;T&gt;();
	}
}
</code></pre>
<p>Könnte es sein, dass ich hier nicht drumrumkomme die Get_Algorithm in ne eigene Klasse bzw. in eine andere Klasse zu packen?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378418</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 05 Oct 2007 11:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 09:42:22 GMT]]></title><description><![CDATA[<p>das würde ich auch gerne sehen. ging es dem threadstarter nicht darum, zur laufzeit zu entscheiden, was verwendet werden soll. c++ templates werden doch zur compilezeit festgelegt, wie können die virtuelle funktionen ersetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378422</guid><dc:creator><![CDATA[ja]]></dc:creator><pubDate>Fri, 05 Oct 2007 09:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 10:26:03 GMT]]></title><description><![CDATA[<p>Zur obigen Frage mittels der vermeideung von virtuellen Funktionen habe ich folgenden Thread gefunden:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-192539-and-view-is-next.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-192539-and-view-is-next.html</a></p>
<p>Nur was da der vorteil sein soll weiß ich (noch) nicht. Evtl. sind die Kosten um virtuelle Funktionen aufzurufen etwas teurer bezüglich Zeit?</p>
<p>Ich hätte da noch eine Frage und<br />
ich weiß jetzt nicht ob ich deswegen einen neuen Thread aufmachen soll, deswegen poste ich lieber hier weil es könnte sein dass es eher hier her gehört:</p>
<p>ich würde gerne folgenden Code so &quot;vereinfachen&quot;, dass das switch statement entfällt. Nun bin ich mir nicht sicher ob es überhaupt geht - evtl. irgendwie über virtuelle Funktionen oder so?</p>
<pre><code class="language-cpp">Matrix&lt;double&gt; *A_REAL = NULL;		
	Matrix&lt;COMPLEX&gt; *A_COMPLEX = NULL;

        switch(o_rm.Get_Type(file))
	{
		case real:	
		{
			std::cout &lt;&lt; &quot;\t    Input is REAL!&quot; &lt;&lt; std::endl;

			o_rm.Read_Matrix(file, &amp;A_REAL);			

			// Mache was mit A_REAL;		

			delete A_REAL;	
			break;
		} 					
 		case complex:
		{
 			std::cout &lt;&lt; &quot;\tInput is COMPLEX&quot; &lt;&lt; std::endl;

                       o_rm.Read_Matrix(file, &amp;A_COMPLEX);

                       // mache was mit A_COMPLEX

		        delete A_COMPLEX;	

			break;		
		}
</code></pre>
<p>In Read_Matrix gibt es Template-Spezifikationen, die unterschiedlich vom Template, die Matrix unterschiedlich aufbauen. Braucht ihr noch mehr Informationen?<br />
Ich kann also erst zur Laufzeit entscheiden welches Template benutzt wird...<br />
Das ganze läuft in meiner main(), also in keiner Template Klasse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378448</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 05 Oct 2007 10:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 11:03:20 GMT]]></title><description><![CDATA[<p>ja schrieb:</p>
<blockquote>
<p>ging es dem threadstarter nicht darum, zur laufzeit zu entscheiden, was verwendet werden soll.</p>
</blockquote>
<p>Das lese ich nirgendwo. Wenn das der Fall ist, sind Templates in der Tat nich geeignet.</p>
<p>Mati schrieb:</p>
<blockquote>
<p>Und was ist der Grund warum über Templates das TMP &quot;besser&quot; ist als über virtuelle Funktionen ?</p>
</blockquote>
<p>Erstmal, weil es der C++-ige Weg wäre (so arbeitet ja auch die STL, wo möglich). Außerdem ist die Methode wesentlich effizienter als die über virtuelle Funktionen, weil die Auflösung eben zur Compilezeit und nicht zur Laufzeit geschieht.</p>
<p>Der Code sähe prinzipiell genauso aus, nur dass die Funktionen nicht virtuell gemacht werden und die Ziel-Klasse parametrisiert wird.</p>
<pre><code class="language-cpp">struct Algorithm1 {
    void Method1() {}
    void Method2() {}
}

struct Alg2 {
    void Method1() {}
    void Method2() {}
}

void my_method&lt;T&gt;(T const&amp; algorithm) {
    algorithm.Method1();
    // … was anderes …
    algorithm.Method2();
}

// Aufruf:
if (flag)
    my_method(Algorithm1());
else
    my_method(Alg2());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1378502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378502</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 05 Oct 2007 11:03:20 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 12:02:09 GMT]]></title><description><![CDATA[<p>hmm...wie viel Zeit kostet denn der aufruf virtueller funktionen im vergleich?<br />
Ist das nur marginal oder doch &quot;zu spüren&quot;.<br />
Bei mir würde es nur einmal passieren.</p>
<p>Ich schaffe es leider über Templates nicht so ganz:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Algorithm1 
{
   public:
       void Method1() {}
       void Method2() {}
};

template &lt;class T&gt;
class  Alg2 {
    public:
       void Method1() {}
       void Method2() {}
};

template&lt;class T&gt; T*
Algorithm::Get_Algorithm(const int opt_level)
{
     switch(opt_level)
    {
         case 0: return new Algorithm&lt;T&gt;();
         case 1: return new Alg2&lt;T&gt;();
    }
}

Base&lt;T&gt;::my_method(T* algorithm) 
{
    algorithm-&gt;Method1();
    // … was anderes …
    algorithm-&gt;Method2();
}

// in der main:

Algorithm&lt;double&gt; o_alg;
Base&lt;double&gt; o_base;
o_base.my_method(o_alg.Get_Algorithm(0));
</code></pre>
<p>mein error:</p>
<pre><code>Fehler: »C&lt;double&gt;*« kann nicht nach »double*« in return umgewandelt werden
main.cpp:154:   instantiated from here
</code></pre>
<p>Schon klar der feher aber wie kann ich denn den switch in eine eigene Klasse packen um von dort den richtigen klassentyp zu returnen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378550</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 05 Oct 2007 12:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 12:16:30 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Finix,</p>
<p>du sagst, das TMP habe nichts mit Templates zu tun und gehst dann dazu über, mit virtuellen Funktionen um Dich zu schmeißen. Da muss ich Einspruch erheben, denn das TMP lässt sich natürlich vorzüglich mit Templates umsetzen – und in C++ würde ich im Zweifelsfall immer diese Methode verwenden, statt virtueller Funktionen.</p>
<p>Dass diese Methode in einem Thread im C++-Forum nicht einmal erwähnt wird, finde ich schade.</p>
</blockquote>
<p>Hier nochmal zum Mitschreiben: <strong>das Template Method Pattern hat nichts mit Templates zu tun!</strong> Es geht darum dass <em>TMP != Templates</em> und vor allem auch <em>TMP != Template Technik</em>.</p>
<p>Und in C++ stehst du nun mal oft nicht vor dem &quot;Zweifelsfall&quot; sondern vor Limitierungen der Sprache - sollte ich mich täuschen, wäre ich dir sehr verbunden würdest du mir deine Variante, rein mit Templates, in diesem Fall (&quot;über ein input-flag an und ausschaltbar&quot;), vorstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378563</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 05 Oct 2007 12:16:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 12:20:16 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>ja schrieb:</p>
<blockquote>
<p>ging es dem threadstarter nicht darum, zur laufzeit zu entscheiden, was verwendet werden soll.</p>
</blockquote>
<p>Das lese ich nirgendwo. Wenn das der Fall ist, sind Templates in der Tat nich geeignet.</p>
</blockquote>
<p>ich hätte es so verstanden, weil er sich über die vielen if-else beschwert hat.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9974">@Mati</a><br />
Für dein switch Problem könnte das <a href="http://en.wikipedia.org/wiki/State_pattern" rel="nofollow">State Pattern</a> was sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378570</guid><dc:creator><![CDATA[ja]]></dc:creator><pubDate>Fri, 05 Oct 2007 12:20:16 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 13:30:11 GMT]]></title><description><![CDATA[<p>Danke ja - aber um ehrlich zu sein bin ich mir (egal wieviel ich übers state pattern lese) nicht sicher obs gehen wird...ich brauch auch immer einen beispielcode...ich suche schon danach aber sinnvolle einfache C++ bespiele zum state pattern finde ich nicht - wäre nett wenn mir jemand helfen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378625</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:30:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 13:50:51 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>ich suche schon danach aber sinnvolle einfache C++ bespiele zum state pattern finde ich nicht - wäre nett wenn mir jemand helfen könnte.</p>
</blockquote>
<p>Du kennst google?<br />
Du weißt wie man Suchworte in google einsetzt?</p>
<p>Such mal nach: State Pattern C++</p>
<p>Und wenn du da wirklich nichts findest (bezweifel ich wenn ich das Überblicke), dann kannst du gerne weiter fragen... (Hinweis: selbst mit state muster c++ und Einschränkung auf deutsche Seiten wird man fündig...)</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378642</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:50:51 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 13:51:11 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>ich suche schon danach aber sinnvolle einfache C++ bespiele zum state pattern finde ich nicht - wäre nett wenn mir jemand helfen könnte.</p>
</blockquote>
<p>Wie wäre es hiermit: <a href="http://en.wikipedia.org/wiki/State_pattern" rel="nofollow">http://en.wikipedia.org/wiki/State_pattern</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378643</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:51:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 13:58:31 GMT]]></title><description><![CDATA[<p>Hallo?<br />
Ich sagte bereits:</p>
<blockquote>
<p>sinnvolle einfache C++ bespiele zum state pattern finde ich nicht</p>
</blockquote>
<p>unter google finde ich nur umfangreiche und nicht gerade erklärende beispiele.</p>
<p>Aber gut - damit muss ich wohl leben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378650</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:58:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 14:13:53 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a>:</p>
<blockquote>
<p>Praktisch also im cpp-File. Das ist auch von den Abhängigkeiten her sinnvoller.</p>
</blockquote>
<p>wenn ich gleichzeitig mit Templates arbeite - ist das dan auch möglich?</p>
</blockquote>
<p>Nein, dann natürlich nicht (außer mit export etc. blahblah). Das entscheidende ist, dass der Ctor außerhalb der Klasse base definiert sein muss.</p>
<pre><code class="language-cpp">class Base {
public:
  Base();
};

// ich schreib hier die Klassendefinition direkt hin, bei dir wäre ein 
// #include &quot;derived.h&quot; an dieser Stelle
class Derived : public Base {
public:
  Derived() { blub(); }
};

// jetzt ist Derived erst bekannt und kann konstruiert werden
Base::Base() {
  new Derived() ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1378660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378660</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 05 Oct 2007 14:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 14:32:51 GMT]]></title><description><![CDATA[<p>Ok, dann versuche ich eine konkrete Frage zu stellen:</p>
<p>Ich bin mir nicht sicher ob ich missverstanden wurde. Ich will in der main() einen Template - Typ zurückbekommen, der anhand eines int-werts entweder double oder COMPLEX ist.</p>
<p>Ich kann ja aus der main keine Templates initialisieren. Also sowas geht ja in der main nicht:</p>
<pre><code class="language-cpp">Abstract_Matrix ab_mat;

// 0 für real
// 1 für complex
Matrix&lt;T&gt;* matrix = ab_mat.Get_Type(0);

//in der Abstract_Matrix

template &lt;class T&gt;
class Abstract_Matrix
{
     public:

            T* Get_Type(int c)
            {
                     if (c)
                         return new Matrix&lt;double&gt;;
                     else return new Matrix&lt;COMPLEX&gt;;
            }  
};
</code></pre>
<p>so ist es ja alles schwachsinn.</p>
<p>Nach diesem Satz:</p>
<pre><code>This is a clean way for an object to partially change its type at runtime.
</code></pre>
<p>Unter diesem Link:<br />
<a href="http://en.wikipedia.org/wiki/State_pattern" rel="nofollow">http://en.wikipedia.org/wiki/State_pattern</a></p>
<p>gibt es die folgenden Methoden:</p>
<pre><code class="language-cpp">selectPenTool() {
     currentTool.reset(new PenTool);
   }

   selectSelectionTool() {
     currentTool.reset(new SelectionTool);
   }
</code></pre>
<p>Allerdings ist mir schleierhaft wie ich denn einen Template-Basierten DrawingController bauen sollte, der seinen Template-Typ von double nach COMPLEX ändert bzw. wechseln braucht er ja nicht mal. Er braucht ihn ja nur zu initialisieren....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378674</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 05 Oct 2007 14:32:51 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 15:09:52 GMT]]></title><description><![CDATA[<p>Wie schon mehrfach angedeutet, mit einem rein Template-basiertem Ansatz kannst du da zur Laufzeit nicht viel machen.</p>
<p>Davon abgesehen hast du dich mit deinem Matrix-Beispiel, relativ gesehen, kilometerweit von deinem Ausgangsproblem entfernt.<br />
So kann dir nicht nur keiner wirklich helfen, irgendwann fühlen sich die Leute auch ein wenig verarscht. Wenn du Verständnisprobleme mit einem der Pattern hast und diesbezüglich Erleuchtung suchst, mach das deutlich und öffne einen neuen Thread dazu. Wenn du Hilfe zu deinem konkreten Problem suchst, dann leg endlich mal dar was du überhaupt machen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378703</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 05 Oct 2007 15:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern anstatt if-else? on Fri, 05 Oct 2007 15:31:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie schon mehrfach angedeutet, mit einem rein Template-basiertem Ansatz kannst du da zur Laufzeit nicht viel machen.</p>
</blockquote>
<p>So etwas wollte ich wissen - mehr nicht.</p>
<blockquote>
<p>Davon abgesehen hast du dich mit deinem Matrix-Beispiel, relativ gesehen, kilometerweit von deinem Ausgangsproblem entfernt.<br />
So kann dir nicht nur keiner wirklich helfen, irgendwann fühlen sich die Leute auch ein wenig verarscht.</p>
</blockquote>
<p>Ich habe geschrieben, dass ich ein weiteres Problem habe, wo ich nicht sicher bin ob es evtl. über Patterns lösbar wäre, evtl. sogar über das TMP. Deshalb hier gepostet.<br />
Wenn man neue Threads aufmacht wird man angeschnauzt man öffne für dieselben Probleme ständig neue Threads.<br />
Wenn man in gleichen Threads arbeitet genauso - also was nun?</p>
<blockquote>
<p>Wenn du Verständnisprobleme mit einem der Pattern hast und diesbezüglich Erleuchtung suchst, mach das deutlich und öffne einen neuen Thread dazu.</p>
</blockquote>
<p>Mit so einem Threas käme als Antwort: Schau bei google oder benutze die Suchfunktion. Auf solche Antworten kann ich verzichten - so ein Thread bringt überhaupt nichts.</p>
<blockquote>
<p>Wenn du Hilfe zu deinem konkreten Problem suchst, dann leg endlich mal dar was du überhaupt machen willst.</p>
</blockquote>
<p>Mein konkretes problem habe ich dargestellt. Das kann mir nicht angekreidet werden. Vorgeworden werden kann mir nur, dass ich mich sehr unverständlich ausgedrückt habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378715</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 05 Oct 2007 15:31:01 GMT</pubDate></item></channel></rss>