<?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[Templateklasse mit einer spezialisierten Methode - gute Lösung?]]></title><description><![CDATA[<p>Ich will je nachdem, ob das Template-Argument ein Pointer-Typ ist, eine kleine angepasste Methode zur Verfügung stellen (falls Pointer, mit Referenz und falls keiner, ohne Referenz). Der Rest der Klasse soll aber gleich sein.</p>
<p>So sieht meine Klasse im Moment aus, ist das eine gute Lösung ohne auf irgendwelche externen Libs wie boost zurückzugreifen?</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class foo
{
    public:
        void bar(const T &amp;value)
        {
            std::cout &lt;&lt; &quot;Non-Pointer&quot;;
        }

        void foobar()
        {
            std::cout &lt;&lt; &quot;bar&quot;;
        }
};

template &lt;class T&gt;
class foo&lt;T *&gt; : public foo&lt;T&gt;
{
    public:
        void bar(const T value)
        {
            std::cout &lt;&lt; &quot;Pointer&quot;;
        }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/260616/templateklasse-mit-einer-spezialisierten-methode-gute-lösung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 23:40:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260616.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Feb 2010 20:44:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 20:44:19 GMT]]></title><description><![CDATA[<p>Ich will je nachdem, ob das Template-Argument ein Pointer-Typ ist, eine kleine angepasste Methode zur Verfügung stellen (falls Pointer, mit Referenz und falls keiner, ohne Referenz). Der Rest der Klasse soll aber gleich sein.</p>
<p>So sieht meine Klasse im Moment aus, ist das eine gute Lösung ohne auf irgendwelche externen Libs wie boost zurückzugreifen?</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class foo
{
    public:
        void bar(const T &amp;value)
        {
            std::cout &lt;&lt; &quot;Non-Pointer&quot;;
        }

        void foobar()
        {
            std::cout &lt;&lt; &quot;bar&quot;;
        }
};

template &lt;class T&gt;
class foo&lt;T *&gt; : public foo&lt;T&gt;
{
    public:
        void bar(const T value)
        {
            std::cout &lt;&lt; &quot;Pointer&quot;;
        }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1852061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852061</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Sun, 07 Feb 2010 20:44:19 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 20:50:34 GMT]]></title><description><![CDATA[<p>Warum denn das? Es ist vollkommen sicher, wenn du eine Referenz auf nen pointer übergibst. Da passiert nix böses, manchmal braucht man sowas sogar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852064</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 07 Feb 2010 20:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 20:51:12 GMT]]></title><description><![CDATA[<p>IMO mussst du alles neuschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852065</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sun, 07 Feb 2010 20:51:12 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 20:51:51 GMT]]></title><description><![CDATA[<p>Weil in dem Fall dann die Referenz const wäre, ich den Pointer aber dereferenzieren und den Inhalt des dahinterstehenden Objekts ändern könnte. Genau das will ich aber verhindern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852067</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Sun, 07 Feb 2010 20:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 20:57:10 GMT]]></title><description><![CDATA[<p>Max0r schrieb:</p>
<blockquote>
<p>Weil in dem Fall dann die Referenz const wäre, ich den Pointer aber dereferenzieren und den Inhalt des dahinterstehenden Objekts ändern könnte. Genau das will ich aber verhindern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Bist du sicher? Außerdem hast du Fehler in deinem Beispiel in der spezilisierten Template.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852069</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sun, 07 Feb 2010 20:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 21:05:25 GMT]]></title><description><![CDATA[<p>Zeus schrieb:</p>
<blockquote>
<p>Max0r schrieb:</p>
<blockquote>
<p>Weil in dem Fall dann die Referenz const wäre, ich den Pointer aber dereferenzieren und den Inhalt des dahinterstehenden Objekts ändern könnte. Genau das will ich aber verhindern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Bist du sicher? Außerdem hast du Fehler in deinem Beispiel in der spezilisierten Template.</p>
</blockquote>
<p>Ja bin ich. Wäre nett, wenn du mir die Stelle verraten würdest, an der der Fehler ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852072</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Sun, 07 Feb 2010 21:05:25 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 21:26:39 GMT]]></title><description><![CDATA[<p>Zeile 21, dein Compiler wird Hinweisen, dass du T* nicht auf T konvertieren kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852078</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sun, 07 Feb 2010 21:26:39 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 22:30:23 GMT]]></title><description><![CDATA[<p>Kann man so machen. Allerdings ist das Problem, dass der übermüdete Programmierer auf die Idee kommen könnte die Basisklasse als polymorphe Basisklasse zu nutzen:</p>
<pre><code class="language-cpp">int main ()
{
 foo&lt;int*&gt; f1;
 foo&lt;int&gt;* pf = &amp;f1;
 pf-&gt;bar (/**/); // na, was ist der statische Typ?
}
</code></pre>
<p>oder noch schlimmer:</p>
<pre><code class="language-cpp">int main ()
{
 foo&lt;int&gt;* pf = new foo&lt;int*&gt;;
 //...
 delete pf; // hups
}
</code></pre>
<p>Allerdings kann man gegen so einen Missbrauch denke ich nicht all zu viel machen. Sollten aber klar sein.</p>
<p>Ebenfalls darf nicht vergessen werden, dass das keine Überschreibung der Funktion, sondern lediglich eine Überladung ist. Die Funktion der Basisklasse ist durchaus noch erreichbar:</p>
<pre><code class="language-cpp">int main ()
{
 foo&lt;int*&gt; f;
 f.foo&lt;int&gt;::bar (/**/);
}
</code></pre>
<p>Glücklicherweise spielt es bei der Überladungsauflösung keine Rolle, aber wenn man will kann man sie dennoch in Betracht ziehen:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class foo&lt;T *&gt; : public foo&lt;T&gt;
{
  using foo&lt;T&gt;::bar;

    public:
        void bar(const T value)
        {
            std::cout &lt;&lt; &quot;Pointer&quot;;
        }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1852118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852118</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Feb 2010 22:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 22:39:32 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Allerdings kann man gegen so einen Missbrauch denke ich nicht all zu viel machen.</p>
</blockquote>
<p>Man kann den Spiess zum Beispiel umdrehen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class foo_impl
{
	public:
		void bar(const T&amp; value)
        {
            std::cout &lt;&lt; &quot;Non-Pointer&quot;;
        }
};

template &lt;typename T&gt;
class foo_impl&lt;T*&gt;
{
    public:
        void bar(T value)
        {
            std::cout &lt;&lt; &quot;Pointer&quot;;
        }
};

template &lt;typename T&gt;
class foo : public foo_impl&lt;T&gt;
{
    public:
        void foobar()
        {
            std::cout &lt;&lt; &quot;bar&quot;;
        }
};
</code></pre>
<p>Ist zwar etwas mehr Code, aber dafür wird hier keine Vererbung missbraucht. Übrigens interessant, im <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1852116.html" rel="nofollow">anderen Thread</a> gings fast um das gleiche. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852121</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Feb 2010 22:39:32 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 23:13:13 GMT]]></title><description><![CDATA[<p>Naja. Ich habe da ja das benutzen der Basisklasse als Polymorphe Basisklasse und dann das deleten gmeint. Da hast du mit deiner Lösung das gleiche Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852133</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Feb 2010 23:13:13 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 23:16:22 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Naja. Ich habe da ja das benutzen der Basisklasse als Polymorphe Basisklasse und dann das deleten gmeint. Da hast du mit deiner Lösung das gleiche Problem.</p>
</blockquote>
<p>Wieso? <code>foo_impl</code> ist ein Implementierungsdetail, den Benutzer hat die Klasse nicht zu interessieren.</p>
<p>Wenn man die Klasse noch in einen <code>detail</code> -Namensraum verpackt, sollte dieser Umstand verdeutlicht werden. <em>Dann</em> noch Fehler zu machen ist Absicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852135</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Feb 2010 23:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 23:31:30 GMT]]></title><description><![CDATA[<p>Jap. Das ist schon klar. Es ist auch so Absicht dahinter eine explizit nicht dafür gedachte Klasse polymorph zu nutzen.. Ich sagte ja, dass man nicht _viel_ dagegen machen kann. In dem Sinne, dass man das nicht verhindern kann, dass man das doch noch standardkonform machen kann. (man kann ja sonst natürlich so ziemlich alles mit irgendwelchen Hacks umgehen).</p>
<p>Das ganze schön verpacken kann man natürlich, aber dann würde ich vorher eine bessere Alternative für das eigentliche Problem finden wollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852144</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Feb 2010 23:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 23:41:37 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Es ist auch so Absicht dahinter eine explizit nicht dafür gedachte Klasse polymorph zu nutzen..</p>
</blockquote>
<p>Hat was. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Oder halt wie du sagst Übermüdung. Dem darf man aber auch <code>detail</code> -Eindringen zutrauen...</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Das ganze schön verpacken kann man natürlich, aber dann würde ich vorher eine bessere Alternative für das eigentliche Problem finden wollen.</p>
</blockquote>
<p>Grundsätzlich hat man dieses &quot;Problem&quot; immer, wenn man über Metaprogrammierung das Interface einer Klasse bilden will. Da braucht es Vererbung, und im Normalfall eben nicht polymorphe. Daher kann es oftmals sein, dass es keine bessere Alternative gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852151</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Feb 2010 23:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse mit einer spezialisierten Methode - gute Lösung? on Sun, 07 Feb 2010 23:50:45 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Es ist auch so Absicht dahinter eine explizit nicht dafür gedachte Klasse polymorph zu nutzen..</p>
</blockquote>
<p>Hat was. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Oder halt wie du sagst Übermüdung. Dem darf man aber auch <code>detail</code> -Eindringen zutrauen...</p>
</blockquote>
<p>Man könnte es ja ganz schlau machen und das ganze in einen namespace 'if_you_ever_use_this_namespace_than_this_is_your_resignation' packen. Ich denke, dass man dann recht sicher sein kann, dass das selbst ein Programmierer mit einer Ordentlichen Menge Alkohol und Drogen nicht braucht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Das ganze schön verpacken kann man natürlich, aber dann würde ich vorher eine bessere Alternative für das eigentliche Problem finden wollen.</p>
</blockquote>
<p>Grundsätzlich hat man dieses &quot;Problem&quot; immer, wenn man über Metaprogrammierung das Interface einer Klasse bilden will. Da braucht es Vererbung, und im Normalfall eben nicht polymorphe. Daher kann es oftmals sein, dass es keine bessere Alternative gibt.</p>
</blockquote>
<p>Jap. Das stimmt wohl. Ich meinte halt das _eigentliche_ Problem des TO's, dass er uns noch gar nicht verraten hat. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> - Ansonsten würde ich es halt eben so machen, wie die STL und wenn mans falsch benutzt, dann ist man selbst schuld.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852156</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Feb 2010 23:50:45 GMT</pubDate></item></channel></rss>