<?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[Implizite Konvertierung für Template-Argumente]]></title><description><![CDATA[<p>Guten morgen,</p>
<p>ich will mal wieder was unmögliches ^^</p>
<p>Nehmen wir an, ich habe einen Satz Typen, die sich implizit in Standardtypen konvertieren lassen:</p>
<pre><code class="language-cpp">struct Wrapper32 {
    Wrapper32(int32_t i):data_(i) {}
    operator int32_t() { return data_; }
    int32_t data_;
};

struct Wrapper16 {
    Wrapper16(int16_t i):data_(i) {}
    operator int16_t() { return data_; }
    int16_t data_;
};
// usw, für chars, unsigned, whatever...
</code></pre>
<p>Diese Wrapper haben in der echten Anwendung natürlich noch andere Member, die Metainformationen tragen. Ist hier aber nicht wichtig.</p>
<p>Nehmen wir weiterhin an, es gibt ein Klassentemplate das so aussieht:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U=T&gt;
class Foo {
    Foo();
    T memfun();
    void memfun(const U&amp;);
}
</code></pre>
<p>Jetzt das Problem: U soll jetzt immmer der Wrappertyp von T sein. Also, wenn T==int32_t, dann U=Wrapper32. Rein Kompiliertechnisch geht das natürlich, da man U und T implizit ineinander konvertieren kann. Aber die Templategenerierung passiert ja BEVOR sich der Kompiler über implizite Konvertierung Gedanken macht.</p>
<p>Daher: Gibt es eine kreative Lösung</p>
<pre><code class="language-cpp">template &lt;typename T, typename U = Wrapper(T)&gt;
</code></pre>
<p>auszudrücken?</p>
<p>Gruß,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278634/implizite-konvertierung-für-template-argumente</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 02:16:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278634.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Dec 2010 04:49:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implizite Konvertierung für Template-Argumente on Fri, 10 Dec 2010 04:49:57 GMT]]></title><description><![CDATA[<p>Guten morgen,</p>
<p>ich will mal wieder was unmögliches ^^</p>
<p>Nehmen wir an, ich habe einen Satz Typen, die sich implizit in Standardtypen konvertieren lassen:</p>
<pre><code class="language-cpp">struct Wrapper32 {
    Wrapper32(int32_t i):data_(i) {}
    operator int32_t() { return data_; }
    int32_t data_;
};

struct Wrapper16 {
    Wrapper16(int16_t i):data_(i) {}
    operator int16_t() { return data_; }
    int16_t data_;
};
// usw, für chars, unsigned, whatever...
</code></pre>
<p>Diese Wrapper haben in der echten Anwendung natürlich noch andere Member, die Metainformationen tragen. Ist hier aber nicht wichtig.</p>
<p>Nehmen wir weiterhin an, es gibt ein Klassentemplate das so aussieht:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U=T&gt;
class Foo {
    Foo();
    T memfun();
    void memfun(const U&amp;);
}
</code></pre>
<p>Jetzt das Problem: U soll jetzt immmer der Wrappertyp von T sein. Also, wenn T==int32_t, dann U=Wrapper32. Rein Kompiliertechnisch geht das natürlich, da man U und T implizit ineinander konvertieren kann. Aber die Templategenerierung passiert ja BEVOR sich der Kompiler über implizite Konvertierung Gedanken macht.</p>
<p>Daher: Gibt es eine kreative Lösung</p>
<pre><code class="language-cpp">template &lt;typename T, typename U = Wrapper(T)&gt;
</code></pre>
<p>auszudrücken?</p>
<p>Gruß,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1992335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992335</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 10 Dec 2010 04:49:57 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierung für Template-Argumente on Fri, 10 Dec 2010 05:06:54 GMT]]></title><description><![CDATA[<p>Nimm ne Metafunction:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct MakeWrapperType;

template &lt;&gt;
struct MakeWrapperType&lt;int32_t&gt;
{
    typedef Wrapper32 Type;
};

template &lt;&gt;
struct MakeWrapperType&lt;int16_t&gt;
{
    typedef Wrapper16 Type;
};

template &lt;&gt;
struct MakeWrapperType&lt;double&gt;
{
    typedef WrapperDouble Type;
};

//...

template &lt;typename T, typename U = MakeWrapperType&lt;T&gt;::Type&gt;
class Foo {
    Foo();
    T memfun();
    void memfun(const U&amp;);
};
</code></pre>
<p>Habs nicht probiert, sollte aber so gehen.</p>
<p>p.S.: noch einfacher wäre es natürlich wenn der Wrapper gleich selbst ein Template wäre:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U = Wrapper&lt;T&gt; &gt;
class Foo {
    Foo();
    T memfun();
    void memfun(const U&amp;);
};
</code></pre>
<p>Da das so offensichtlich ist bin ich mal davon ausgegangen dass du das aus irgend einem Grund nicht willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1992337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992337</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 10 Dec 2010 05:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierung für Template-Argumente on Fri, 10 Dec 2010 06:12:33 GMT]]></title><description><![CDATA[<p>Ja, dass der Wrapper kein Template ist, hat leider Gründe. Sonst wäre es in der Tat einfach <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>Aber dein Ansatz erscheint mir doch intuitiv benutzbar. So mach ichs, danke <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/1992341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992341</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 10 Dec 2010 06:12:33 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierung für Template-Argumente on Fri, 10 Dec 2010 06:32:20 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nimm ne Metafunction:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U = MakeWrapperType&lt;T&gt;::Type&gt;
class Foo {
    Foo();
    T memfun();
    void memfun(const U&amp;);
};
</code></pre>
<p>Habs nicht probiert, sollte aber so gehen.</p>
</blockquote>
<p>So geht's:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U = typename MakeWrapperType&lt;T&gt;::Type&gt;
class Foo {
    Foo();
    T memfun();
    void memfun(const U&amp;);
};
</code></pre>
<p>Man beachte das hinzugekommene typename. Woher sollte der arme Kompiler auch vorher wissen, dass MakeWrapperType&lt;T&gt;::Type ein Typ ist und nicht irgendeine Variable.</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1992345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992345</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 10 Dec 2010 06:32:20 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierung für Template-Argumente on Fri, 10 Dec 2010 11:26:16 GMT]]></title><description><![CDATA[<p>Hast Recht, da muss ein <code>typename</code> hin. (MSVC frisst es übrigens auch ohne, Comeau motzt aber)<br />
Könnte der Compiler allerdings leicht selbst checken, da es ja ein Default-Wert für nen Typ-Parameter ist. An der Stelle darf nie was anderes als ein Typ stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1992504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992504</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 10 Dec 2010 11:26:16 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierung für Template-Argumente on Sat, 11 Dec 2010 02:26:03 GMT]]></title><description><![CDATA[<p>Bei typedef könnte es der Compiler auch immer checken. Trotzdem muss ein typename hin. Auf eine Art ist diese Konsistenz auch gut: Von Template-Parametern abhängige Typen müssen immer speziell gekennzeichnet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1992849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1992849</guid><dc:creator><![CDATA[Rubäus der Kleine]]></dc:creator><pubDate>Sat, 11 Dec 2010 02:26:03 GMT</pubDate></item></channel></rss>