<?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[[gelöst] Template &amp;quot;automatisch&amp;quot; spezialisieren]]></title><description><![CDATA[<p>Hi,</p>
<p>habe folgendes Problem:<br />
Um Sachen umzurechnen habe ich ein Klassentemplate, das etwa so aussieht:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U = T&gt;
class Foo {
public:
    struct Functor {
        U operator()(U) const { return 12 * value + 7; } //Beispiel
    }

    Foo (Functor* f):m_func(f) {}

    T bar(const T&amp; value) const {
         return (*m_func)(value);
    }
private:
    Functor* m_func;
}
</code></pre>
<p>Da ist spezialisiert für den Fall eines Vectors, so dass in dem Fall der Funktor elementweise angewendet wird:</p>
<pre><code class="language-cpp">template&lt;&gt;
std::vector&lt;int&gt; Foo&lt;std::vector&lt;int&gt;, int&gt;::bar(const std::vector&lt;int&gt;&amp; value) const 
{
    // *m_func auf jedes Element des Vectors anwenden und neuen Vector zurückgeben
}
</code></pre>
<p>Frage: Wie kann ich erreichen, dass das &quot;automatisch&quot; gemacht wird, wenn ein Vektor auftritt? Also so das folgendes passiert:</p>
<pre><code class="language-cpp">Baz&lt;int&gt; =&gt; typedeft Foo&lt;int&gt; = Foo&lt;int, int&gt;
Baz&lt;std::vector&lt;int&gt; &gt; =&gt; typedeft Foo&lt;std::vector&lt;int&gt;, int&gt;
</code></pre>
<p>Zusammengefasst: Ich möchte den Typen &quot;bestellen&quot; können, den ich möchte, aber wenn das ein vector ist, soll das zweite template-argument der Elementtyp des Vektors sein.</p>
<p>Hoffe, ich konnte es verständlich erklären. Schönen sonnigen Montag noch <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>
<p>Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268316/gelöst-template-quot-automatisch-quot-spezialisieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 00:14:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268316.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Jun 2010 13:49:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Template &amp;quot;automatisch&amp;quot; spezialisieren on Mon, 07 Jun 2010 21:11:48 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>habe folgendes Problem:<br />
Um Sachen umzurechnen habe ich ein Klassentemplate, das etwa so aussieht:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U = T&gt;
class Foo {
public:
    struct Functor {
        U operator()(U) const { return 12 * value + 7; } //Beispiel
    }

    Foo (Functor* f):m_func(f) {}

    T bar(const T&amp; value) const {
         return (*m_func)(value);
    }
private:
    Functor* m_func;
}
</code></pre>
<p>Da ist spezialisiert für den Fall eines Vectors, so dass in dem Fall der Funktor elementweise angewendet wird:</p>
<pre><code class="language-cpp">template&lt;&gt;
std::vector&lt;int&gt; Foo&lt;std::vector&lt;int&gt;, int&gt;::bar(const std::vector&lt;int&gt;&amp; value) const 
{
    // *m_func auf jedes Element des Vectors anwenden und neuen Vector zurückgeben
}
</code></pre>
<p>Frage: Wie kann ich erreichen, dass das &quot;automatisch&quot; gemacht wird, wenn ein Vektor auftritt? Also so das folgendes passiert:</p>
<pre><code class="language-cpp">Baz&lt;int&gt; =&gt; typedeft Foo&lt;int&gt; = Foo&lt;int, int&gt;
Baz&lt;std::vector&lt;int&gt; &gt; =&gt; typedeft Foo&lt;std::vector&lt;int&gt;, int&gt;
</code></pre>
<p>Zusammengefasst: Ich möchte den Typen &quot;bestellen&quot; können, den ich möchte, aber wenn das ein vector ist, soll das zweite template-argument der Elementtyp des Vektors sein.</p>
<p>Hoffe, ich konnte es verständlich erklären. Schönen sonnigen Montag noch <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>
<p>Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908357</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 07 Jun 2010 21:11:48 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Template &amp;quot;automatisch&amp;quot; spezialisieren on Mon, 07 Jun 2010 14:27:45 GMT]]></title><description><![CDATA[<p>Okay, habe ein bißchen gebastelt. Hier ist mein erster Ansatz:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
    struct FooFrontend {
        typedef Foo&lt;T&gt; Type;
        typedef T BasicT;
    };

    template &lt;&gt;
    struct FooFrontend&lt;std::vector&lt;int&gt; &gt; {
        typedef Foo&lt;std::vector&lt;int&gt;, int&gt; Type;
        typedef int BasicT;
    };
</code></pre>
<p>und ggfs. weitere spezilaisierungen für gloat-vectoren usw.</p>
<p>Ein Problem habe ich jetzt allerdings, wenn ich von Foo erbe, um andere Funktoren zu definieren. Beispiel:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class CocreteFoo: public Foo&lt;T, FooFrontend&lt;T&gt;::BasicT&gt;
{
    struct ConcreteFunctor: public Foo&lt;T, FooFrontend&lt;T&gt;::BasicT&gt;::Functor {
        FooFrontend&lt;T&gt;::BasicT operator()(FooFrontend&lt;T&gt;::BasicT value) const 
        { // mach irgendwas }
    };
};
</code></pre>
<p>Dann erzählt mir gcc:</p>
<pre><code>error: type/value mismatch at argument 2 in template parameter list for `template&lt;class T, class U&gt; class Foo'
error: expected a type, got ` FooFrontend&lt;T&gt;::BasicT'
</code></pre>
<p>Aber BasicT ist doch ein Typ!<br />
Irgendwo in meinem Hinterkopf geistert gerade &quot;typedef typename&quot; rum, muss mal den Meyers aus dem Schrank holen <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="😉"
    /></p>
<p>In der Zeit bin ich weiter für konstruktive Vorschläge offen <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>
<p>Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908370</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 07 Jun 2010 14:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Template &amp;quot;automatisch&amp;quot; spezialisieren on Mon, 07 Jun 2010 14:37:12 GMT]]></title><description><![CDATA[<p>Schreib mal ein typename davor, dein Compiler muss nämlich noch wissen, dass er <code>FooFrontend&lt;T&gt;::BasicT</code> als Typenbezeichnung interpretieren darf/soll. Denn es geht aus dem Kontext nicht hervor, dass es sich um einen Typen handelt. <code>FooFrontend&lt;T&gt;::BasicT</code> könnte ja auch beispielsweise ein int sein. Genaues weiß man erst, wenn man T kennt. Der Compiler will es aber vorher wissen, damit er hinterher weiß ob das T das er bekommt auch passt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908374</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 07 Jun 2010 14:37:12 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Template &amp;quot;automatisch&amp;quot; spezialisieren on Mon, 07 Jun 2010 14:44:33 GMT]]></title><description><![CDATA[<p>Bingo!!!</p>
<pre><code class="language-cpp">class ConcreteFoo: public Foo&lt;T, typename FooFrontend&lt;T&gt;::BasicT&gt;
{
    typedef typename FooFrontend&lt;T&gt;::BasicT BasicType;
...
</code></pre>
<p>Klasse. Das geht!</p>
<p>War meine Intuition ja gar nicht so verkeht.</p>
<p>Aktenvermerk an mich selbst: Und schon wieder ein Stück Code produziert, was keiner mehr lesen kann, seufz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908376</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Mon, 07 Jun 2010 14:44:33 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Template &amp;quot;automatisch&amp;quot; spezialisieren on Mon, 07 Jun 2010 14:47:31 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Aktenvermerk an mich selbst: Und schon wieder ein Stück Code produziert, was keiner mehr lesen kann, seufz.</p>
</blockquote>
<p>Ach, das ist relativ harmlos. Ein C++_Programmierer mit 1-2 Jahren Erfahrung kann das recht flüssig lesen. Und wenn das Funktionstemplate gut ist, sollte ja auch im Idealfall niemals wieder jemand den Code zu lesen brauchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908382</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 07 Jun 2010 14:47:31 GMT</pubDate></item></channel></rss>