<?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[default-Implementation für Funktionstemplates]]></title><description><![CDATA[<p>Es wäre praktisch, wenn ich bei Funktionstemplates eine default-Implementierung angeben könnte, die nur benutzt wird, falls keine andere passt.</p>
<p>Beispiel:</p>
<pre><code>/* Für container &quot;c&quot; Anzahl der Elemente in &quot;r&quot; reservieren */
template &lt;class C,class R&gt; decltype(std::declval&lt;C&gt;().reserve(
    decltype(std::end(std::declval&lt;R&gt;()))() -
    decltype(std::begin(std::declval&lt;R&gt;()))()))
reserve_if_possible(C&amp; c,R&amp;&amp; r)
{
  c.reserve(std::end(r)-std::begin(r));
}

/* die hier nur benutzen, falls obiges nicht passt */
template &lt;class C,class R&gt; void reserve_if_possible(C&amp; c,R&amp;&amp; r) {}

[...]
std::vector&lt;int&gt; a,b;
reserve_if_possible(a,b);
</code></pre>
<p>Falls C und R die Anforderungen erfüllen, passen beide Varianten und das ganze kompiliert nicht, weil der Aufruf mehrdeutig ist.<br />
Derartige Situationen habe ich öfter, aber wie löst man dies?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325520/default-implementation-für-funktionstemplates</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 19:24:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325520.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 May 2014 12:31:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to default-Implementation für Funktionstemplates on Tue, 06 May 2014 12:31:15 GMT]]></title><description><![CDATA[<p>Es wäre praktisch, wenn ich bei Funktionstemplates eine default-Implementierung angeben könnte, die nur benutzt wird, falls keine andere passt.</p>
<p>Beispiel:</p>
<pre><code>/* Für container &quot;c&quot; Anzahl der Elemente in &quot;r&quot; reservieren */
template &lt;class C,class R&gt; decltype(std::declval&lt;C&gt;().reserve(
    decltype(std::end(std::declval&lt;R&gt;()))() -
    decltype(std::begin(std::declval&lt;R&gt;()))()))
reserve_if_possible(C&amp; c,R&amp;&amp; r)
{
  c.reserve(std::end(r)-std::begin(r));
}

/* die hier nur benutzen, falls obiges nicht passt */
template &lt;class C,class R&gt; void reserve_if_possible(C&amp; c,R&amp;&amp; r) {}

[...]
std::vector&lt;int&gt; a,b;
reserve_if_possible(a,b);
</code></pre>
<p>Falls C und R die Anforderungen erfüllen, passen beide Varianten und das ganze kompiliert nicht, weil der Aufruf mehrdeutig ist.<br />
Derartige Situationen habe ich öfter, aber wie löst man dies?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397646</guid><dc:creator><![CDATA[asen]]></dc:creator><pubDate>Tue, 06 May 2014 12:31:15 GMT</pubDate></item><item><title><![CDATA[Reply to default-Implementation für Funktionstemplates on Tue, 06 May 2014 12:32:29 GMT]]></title><description><![CDATA[<p>Suchst du SFINAE mittels <code>std::enable_if</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397648</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 May 2014 12:32:29 GMT</pubDate></item><item><title><![CDATA[Reply to default-Implementation für Funktionstemplates on Tue, 06 May 2014 12:50:13 GMT]]></title><description><![CDATA[<p>Ich kenne std::enable_if, bin mir aber nicht sicher, dass es das ist, was ich suche.<br />
Ich könnte das jetzt irgendwie so umschreiben, dass es enable_if benutzt, vielleicht so:</p>
<pre><code>/* Für container &quot;c&quot; Anzahl der Elemente im random access range &quot;r&quot; reservieren */
template &lt;class C,class R&gt; typename std::enable_if&lt;std::is_same&lt;decltype(std::declval&lt;C&gt;().reserve(decltype(std::end(std::declval&lt;R&gt;()))()-decltype(std::begin(std::declval&lt;R&gt;()))())),void&gt;::value,void&gt;::type reserve_if_possible(C&amp; c,R&amp;&amp; r)
{
  c.reserve(std::end(r)-std::begin(r));
}

/* die hier nur benutzen, falls obiges nicht passt */
template &lt;class C,class R&gt; typename std::enable_if&lt;!std::is_same&lt;decltype(std::declval&lt;C&gt;().reserve(decltype(std::end(std::declval&lt;R&gt;()))()-decltype(std::begin(std::declval&lt;R&gt;()))())),void&gt;::value,void&gt;::type reserve_if_possible(C&amp; c,R&amp;&amp; r)
{
}
</code></pre>
<p>Jetzt passen aber beide Varianten nicht, wenn C kein reserve() besitzt.<br />
Lasse ich die default-Variante wie vorher, dann ist es wieder ambiguous, falls C doch ein reserve() besitzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2397657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397657</guid><dc:creator><![CDATA[asen]]></dc:creator><pubDate>Tue, 06 May 2014 12:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to default-Implementation für Funktionstemplates on Tue, 06 May 2014 15:03:26 GMT]]></title><description><![CDATA[<p>so?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;iostream&gt;
struct adl_tag {};

template &lt;class C,class R&gt; void reserve_if_possible_impl(C&amp; c,R&amp;&amp; r, ...)
{
  std::cout &lt;&lt; &quot;list\n&quot;;
}

template &lt;class C,class R&gt;
auto reserve_if_possible(C&amp; c,R&amp;&amp; r) -&gt; decltype(reserve_if_possible_impl(c, std::forward&lt;R&gt;(r), adl_tag{}))
{
  reserve_if_possible_impl(c, std::forward&lt;R&gt;(r), adl_tag{});
}

template &lt;class C,class R&gt;
auto reserve_if_possible_impl(C&amp; c,R&amp;&amp; r, adl_tag) -&gt; decltype(c.reserve(std::end(r)-std::begin(r)))
{
  c.reserve(std::end(r)-std::begin(r));
  std::cout &lt;&lt; &quot;vector\n&quot;;
}

int main()
{
  int data[] = { 1, 2, 3 };
  std::vector&lt;int&gt; v;
  std::list&lt;int&gt; l;
  reserve_if_possible(v,data);
  reserve_if_possible(l,data);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2397681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397681</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 06 May 2014 15:03:26 GMT</pubDate></item><item><title><![CDATA[Reply to default-Implementation für Funktionstemplates on Tue, 06 May 2014 14:11:55 GMT]]></title><description><![CDATA[<p>Ja, das ist perfekt! Wusste doch, dass es einen Trick gibt. Hoffentlich bin ich irgendwann mit Templates soweit vertraut, dass ich selbst auf solche Lösungen kommen kann.<br />
Danke sehr <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/2397686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397686</guid><dc:creator><![CDATA[asen]]></dc:creator><pubDate>Tue, 06 May 2014 14:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to default-Implementation für Funktionstemplates on Tue, 06 May 2014 16:13:16 GMT]]></title><description><![CDATA[<p>camper hat nicht gut gefrüstückt, hier ist die geilere Lösung:</p>
<pre><code>template &lt;class C, class R&gt;
auto reserve_if_possible(C&amp; c, R&amp;&amp; r) -&gt; decltype( c.reserve(std::end(r) - std::begin(r)) )
{
	return c.reserve(std::end(r) - std::begin(r));
}

template &lt;typename ... Args&gt;
void reserve_if_possible(Args&amp;&amp;...)
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2397715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2397715</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 06 May 2014 16:13:16 GMT</pubDate></item></channel></rss>