<?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 richtige Wahl?]]></title><description><![CDATA[<p>Servus, ich will grob gesagt folgendes erreichen: Ich habe im Prinzip und grob gesagt ein sehr kurzes Programmskelett welches nur aus einer for-schleife besteht die in dieser for-schleife eine Routine aufgerufen wird. Diese Routine soll jedoch abhängig von den übergebenen parametern einen anderen Algorithmus ausführen. Ich habe bisher ein Template Method Pattern benutzt - bin aber nicht schlüssig ob es</p>
<p>a) eine sinnvolle und gute Wahl ist<br />
b) ich es auf eine saubere Art gemacht habe.</p>
<p>Zusätzlich habe ich eine weitere Frage wie ich denn in Switch_Algorithm was ja template-basiert aufgebaut ist eine template-spezialisierung realisieren kann von einem algorithmus von dem nur eine spezielle typ-abhängige implementierung existiert. So wie ich es unten darstelle geht es - ist aber wie ich finde seltsam...</p>
<p>Ich werde im Folgenden den Code dazu liefern mit kurzen Kommentaren dazu und wäre froh wenn ihr Stellung dazu nehmen könntet.</p>
<pre><code class="language-cpp">// class Skelet.h
template &lt;class T&gt;
class Skelet
{
    public:

        virtual     ~Skelet&lt;T&gt;(){ }

        void        Skelet_Alg(...);

    protected:

        virtual void        foo(...) = 0;
};

// class Skelet.imp
template &lt;class T&gt;  void
Skelet&lt;T&gt;::Skelet_Alg(...)
{   

    //Iterating
    for (...)
        foo(...);
}

// Einer der Algorithmen die das Skelett implementieren - die anderen 
// Algorithmen sind von der struktur her identisch - nur unterscheiden sich ihre
// berechnungsweise
template &lt;class T&gt;
class Alg_Caching : public Skelet&lt;T&gt;
{
    public:

        Alg_Caching();

        ~Alg_Caching();    

    protected:
        virtual void    foo(...);
};

//und hier die Implementierung von Alg_Caching.imp
template &lt;class T&gt;  void
Alg_Caching&lt;T&gt;::foo(...)
{
   // do something special - alg_caching
}
</code></pre>
<p>Soweit hoffentlich ist die struktur klar. Zur instantiierung des richtigen Algorithmuses mache ich folgendes worüber ich mir bis heute nicht im klaren bin ob das eben sauber ist bzw. wie man es besser machen könnte:</p>
<p>Hier mal der teil der main in dem ich in den jeweiligen algorithmus<br />
switche. Dies geschieht mitHilfe einer id die vorher berechnet wurde:</p>
<pre><code class="language-cpp">// dies geschieht in der main z.B. irgendwo...
   Switch_Algorithm&lt;double&gt; o_alg;
   Skelet&lt;double&gt;* alg_ptr  = o_alg.Get_Algorithm(id);
   alg_ptr-&gt;Skelet_Alg(...);
</code></pre>
<p>Und hier Switch_Algorithm.*:</p>
<pre><code class="language-cpp">// hier der header
template &lt;class T&gt;
class Switch_Algorithm
{
    public:

        Skelet&lt;T&gt;*        Get_Algorithm(  const int opt_level);

        void            Set_Spec(Skelet&lt;double&gt;*&amp; Templ_Spec...);

        void             Set_Spec(Skelet&lt;int&gt;*&amp; Templ_Spec,...);
};

//hier die implementierung
template &lt;class T&gt;  Skelet&lt;T&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm( const int opt_level)
{
    switch(opt_level)
    {
        case no_opt:
            return new Alg_one&lt;T&gt;();
        case caching:
            return new Alg_Caching&lt;T&gt;();
         //weitere case-fälle
        case alg_special:
           Skelet&lt;T&gt;* Templ_Spec = NULL;
           Set_Spec(Templ_Spec, ...);
           return Templ_Spec; 
    }
    //dirty - suppress annoying Warning message
    return NULL;
}

//und hier die template spezialisierungen - ich weiß nicht wie ich das verbinden // kann.

template &lt;&gt; void
Switch_Algorithm&lt;double&gt;::Set_Spec(Skelet&lt;double&gt;*&amp; Templ_Spec...)
{

     Templ_Spec = new Bar(...);
}

template &lt;&gt; void
Switch_Algorithm&lt;type_a&gt;::Set_Spec(Skelet&lt;int&gt;*&amp; Templ_Spec,...)
{
    Templ_Spec = NULL;
}
</code></pre>
<p>Ich setze als für die Template spezialisierung den Pointer auf Null falls die implementierung nicht existiert. So kompiliert der code und ich fange vorher diesen fall ab. Die Anwendung wird also nie in den 'int'-spezialsierungs-teil kommen. Doch ich glaube nicht dass das sauber ist. Wie kann ich denn aus dem switch statement die template-spezialisierung definieren?</p>
<p>Und auch wichtig: Ist diese verwendung über switch_algorithm sauber für eine instantiierung der verschiedenen algorithmen?</p>
<p>Merci</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/236323/template-method-pattern-richtige-wahl</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 22:21:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236323.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Mar 2009 14:53:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Method Pattern richtige Wahl? on Fri, 13 Mar 2009 14:53:27 GMT]]></title><description><![CDATA[<p>Servus, ich will grob gesagt folgendes erreichen: Ich habe im Prinzip und grob gesagt ein sehr kurzes Programmskelett welches nur aus einer for-schleife besteht die in dieser for-schleife eine Routine aufgerufen wird. Diese Routine soll jedoch abhängig von den übergebenen parametern einen anderen Algorithmus ausführen. Ich habe bisher ein Template Method Pattern benutzt - bin aber nicht schlüssig ob es</p>
<p>a) eine sinnvolle und gute Wahl ist<br />
b) ich es auf eine saubere Art gemacht habe.</p>
<p>Zusätzlich habe ich eine weitere Frage wie ich denn in Switch_Algorithm was ja template-basiert aufgebaut ist eine template-spezialisierung realisieren kann von einem algorithmus von dem nur eine spezielle typ-abhängige implementierung existiert. So wie ich es unten darstelle geht es - ist aber wie ich finde seltsam...</p>
<p>Ich werde im Folgenden den Code dazu liefern mit kurzen Kommentaren dazu und wäre froh wenn ihr Stellung dazu nehmen könntet.</p>
<pre><code class="language-cpp">// class Skelet.h
template &lt;class T&gt;
class Skelet
{
    public:

        virtual     ~Skelet&lt;T&gt;(){ }

        void        Skelet_Alg(...);

    protected:

        virtual void        foo(...) = 0;
};

// class Skelet.imp
template &lt;class T&gt;  void
Skelet&lt;T&gt;::Skelet_Alg(...)
{   

    //Iterating
    for (...)
        foo(...);
}

// Einer der Algorithmen die das Skelett implementieren - die anderen 
// Algorithmen sind von der struktur her identisch - nur unterscheiden sich ihre
// berechnungsweise
template &lt;class T&gt;
class Alg_Caching : public Skelet&lt;T&gt;
{
    public:

        Alg_Caching();

        ~Alg_Caching();    

    protected:
        virtual void    foo(...);
};

//und hier die Implementierung von Alg_Caching.imp
template &lt;class T&gt;  void
Alg_Caching&lt;T&gt;::foo(...)
{
   // do something special - alg_caching
}
</code></pre>
<p>Soweit hoffentlich ist die struktur klar. Zur instantiierung des richtigen Algorithmuses mache ich folgendes worüber ich mir bis heute nicht im klaren bin ob das eben sauber ist bzw. wie man es besser machen könnte:</p>
<p>Hier mal der teil der main in dem ich in den jeweiligen algorithmus<br />
switche. Dies geschieht mitHilfe einer id die vorher berechnet wurde:</p>
<pre><code class="language-cpp">// dies geschieht in der main z.B. irgendwo...
   Switch_Algorithm&lt;double&gt; o_alg;
   Skelet&lt;double&gt;* alg_ptr  = o_alg.Get_Algorithm(id);
   alg_ptr-&gt;Skelet_Alg(...);
</code></pre>
<p>Und hier Switch_Algorithm.*:</p>
<pre><code class="language-cpp">// hier der header
template &lt;class T&gt;
class Switch_Algorithm
{
    public:

        Skelet&lt;T&gt;*        Get_Algorithm(  const int opt_level);

        void            Set_Spec(Skelet&lt;double&gt;*&amp; Templ_Spec...);

        void             Set_Spec(Skelet&lt;int&gt;*&amp; Templ_Spec,...);
};

//hier die implementierung
template &lt;class T&gt;  Skelet&lt;T&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm( const int opt_level)
{
    switch(opt_level)
    {
        case no_opt:
            return new Alg_one&lt;T&gt;();
        case caching:
            return new Alg_Caching&lt;T&gt;();
         //weitere case-fälle
        case alg_special:
           Skelet&lt;T&gt;* Templ_Spec = NULL;
           Set_Spec(Templ_Spec, ...);
           return Templ_Spec; 
    }
    //dirty - suppress annoying Warning message
    return NULL;
}

//und hier die template spezialisierungen - ich weiß nicht wie ich das verbinden // kann.

template &lt;&gt; void
Switch_Algorithm&lt;double&gt;::Set_Spec(Skelet&lt;double&gt;*&amp; Templ_Spec...)
{

     Templ_Spec = new Bar(...);
}

template &lt;&gt; void
Switch_Algorithm&lt;type_a&gt;::Set_Spec(Skelet&lt;int&gt;*&amp; Templ_Spec,...)
{
    Templ_Spec = NULL;
}
</code></pre>
<p>Ich setze als für die Template spezialisierung den Pointer auf Null falls die implementierung nicht existiert. So kompiliert der code und ich fange vorher diesen fall ab. Die Anwendung wird also nie in den 'int'-spezialsierungs-teil kommen. Doch ich glaube nicht dass das sauber ist. Wie kann ich denn aus dem switch statement die template-spezialisierung definieren?</p>
<p>Und auch wichtig: Ist diese verwendung über switch_algorithm sauber für eine instantiierung der verschiedenen algorithmen?</p>
<p>Merci</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679390</guid><dc:creator><![CDATA[derHeinzi]]></dc:creator><pubDate>Fri, 13 Mar 2009 14:53:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern richtige Wahl? on Fri, 13 Mar 2009 15:06:14 GMT]]></title><description><![CDATA[<p>Klingt ein bisschen mehr nach dem Strategy-Pattern was du vorhast...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679405</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 13 Mar 2009 15:06:14 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern richtige Wahl? on Fri, 13 Mar 2009 15:36:05 GMT]]></title><description><![CDATA[<p>hmm...ja ich habs mir gerade angeschaut das strategy-pattern - sieht tatsächlich irgendwie ähnlich aus zu dem was ich vorhab. Wo liegt denn dann der Unterschied zwischen Template Method Pattern und Strategy Pattern? Dennoch würde ich gern meinen ersten Post beantwortet bekommen mit meinen fragen noch - danke euch schon mal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679444</guid><dc:creator><![CDATA[derHeinzi]]></dc:creator><pubDate>Fri, 13 Mar 2009 15:36:05 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern richtige Wahl? on Fri, 13 Mar 2009 15:41:08 GMT]]></title><description><![CDATA[<p>derHeinzi schrieb:</p>
<blockquote>
<p>hmm...ja ich habs mir gerade angeschaut das strategy-pattern - sieht tatsächlich irgendwie ähnlich aus zu dem was ich vorhab. Wo liegt denn dann der Unterschied zwischen Template Method Pattern und Strategy Pattern? Dennoch würde ich gern meinen ersten Post beantwortet bekommen mit meinen fragen noch - danke euch schon mal!</p>
</blockquote>
<p>Template Method ist dafür da, wenn du einen Kern hast der immer gleich ist. zB du lockst wichtige Resourcen am Anfang und gibst sie am Ende des Algos wieder frei. Oder ähnliches - jedenfalls hast du fixen Code der bei jedem Algo gleich ist. Template Method ermöglicht dir dann Teile des Algos anzupassen.</p>
<p>Strategy dagegen ermöglicht es dir Algorithmen komplett auszutauschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679447</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 13 Mar 2009 15:41:08 GMT</pubDate></item><item><title><![CDATA[Reply to Template Method Pattern richtige Wahl? on Mon, 16 Mar 2009 09:55:50 GMT]]></title><description><![CDATA[<p>*push</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1680715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1680715</guid><dc:creator><![CDATA[derHeinzi]]></dc:creator><pubDate>Mon, 16 Mar 2009 09:55:50 GMT</pubDate></item></channel></rss>