<?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[Kopie oder konstante Referenz?]]></title><description><![CDATA[<p>Hallo,</p>
<p>momentan programmiere ich eine Mathematik-Lib, in der Polynome als Vektorräume aufgefasst werden, wobei die Koeffizienten in einem std::array/std::vector (letzteres bei Rang 0 -&gt; dynamische Dimension) gespeichert werden.</p>
<p>Nun habe ich folgende Funktion, um das Polynom auf eine Variable anzuwenden (im Fall Rang &gt; 0):</p>
<pre><code>template &lt;typename N,size_t D&gt;
class Polynomial : public VectorSpace&lt;N,D+1&gt;
{
    // stuff
    template &lt;typename T&gt;
    T calc(T t);
    // stuff
}
</code></pre>
<p>Mein Problem ist, dass T sowohl ein Basistyp als auch ein benutzerdefinierter Typ (z.B. ein Vektor) sein kann.</p>
<ol>
<li>Gibt es eine Möglichkeit, den Compiler entscheiden zu lassen, ob er als Argument eine Kopie oder eine konstante Referenz nimmt?</li>
<li>Falls dies nicht möglich sein sollte, wäre es dann klüger, konstante Referenzen zu nutzen?</li>
</ol>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311125/kopie-oder-konstante-referenz</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 00:32:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311125.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Nov 2012 14:18:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 14:18:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>momentan programmiere ich eine Mathematik-Lib, in der Polynome als Vektorräume aufgefasst werden, wobei die Koeffizienten in einem std::array/std::vector (letzteres bei Rang 0 -&gt; dynamische Dimension) gespeichert werden.</p>
<p>Nun habe ich folgende Funktion, um das Polynom auf eine Variable anzuwenden (im Fall Rang &gt; 0):</p>
<pre><code>template &lt;typename N,size_t D&gt;
class Polynomial : public VectorSpace&lt;N,D+1&gt;
{
    // stuff
    template &lt;typename T&gt;
    T calc(T t);
    // stuff
}
</code></pre>
<p>Mein Problem ist, dass T sowohl ein Basistyp als auch ein benutzerdefinierter Typ (z.B. ein Vektor) sein kann.</p>
<ol>
<li>Gibt es eine Möglichkeit, den Compiler entscheiden zu lassen, ob er als Argument eine Kopie oder eine konstante Referenz nimmt?</li>
<li>Falls dies nicht möglich sein sollte, wäre es dann klüger, konstante Referenzen zu nutzen?</li>
</ol>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275133</guid><dc:creator><![CDATA[Polynomteiler]]></dc:creator><pubDate>Tue, 27 Nov 2012 14:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 14:26:02 GMT]]></title><description><![CDATA[<p>du könntest deine funktion für die standard datentypen spezialisieren, das könnte nur sehr viel redundanz und schreibarbeit nach sich ziehen</p>
<p>ansonsten lieber const&amp;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275145</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 27 Nov 2012 14:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 14:28:34 GMT]]></title><description><![CDATA[<ol>
<li>Theoretisch ja. Mit Templatemetaprogrammierungsmonstern kannst du feststellen, ob es ein eigebauter oder ein benutzerdefinierter Typ ist und entsprechend Spezialisierungen einführen. Fertige Templatemetaprogrammierungsmonster gibts in der Boost-Bibliothek und ab C++11 auch in der Standardbiblitohek.</li>
<li>Mach das. Der mögliche Effizienzverlust ist sehr, sehr gering. Da Templates naturgemäß für den Compiler oft voll transparent sind, wird eventuell sogar alles perfekt optimiert, so dass es gar keinen Unterschied gibt.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2275148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275148</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 27 Nov 2012 14:28:34 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 14:30:52 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>du könntest deine funktion für die standard datentypen spezialisieren, das könnte nur sehr viel redundanz und schreibarbeit nach sich ziehen</p>
</blockquote>
<p>Das wären extrem viele Spezialisierungen, das widerstrebt irgendwie dem Prinzip der Templates.</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>ansonsten lieber const&amp;</p>
</blockquote>
<p>Bringt es eigentlich wirklich so viel, Standardtypen und Iteratoren als Kopie anstatt als Referenz zu übergeben? Was daran effizienter sein soll, habe ich nie wirklich verstanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275151</guid><dc:creator><![CDATA[Polynomteiler]]></dc:creator><pubDate>Tue, 27 Nov 2012 14:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 14:58:52 GMT]]></title><description><![CDATA[<p>Du könntest auch was mit enable_if und is_fundamental basteln.</p>
<p><em>Edit: Ach, das hat der Sepp ja quasi schon geschrieben.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275168</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 27 Nov 2012 14:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 15:05:07 GMT]]></title><description><![CDATA[<p>Polynomteiler schrieb:</p>
<blockquote>
<p>Das wären extrem viele Spezialisierungen, das widerstrebt irgendwie dem Prinzip der Templates.</p>
</blockquote>
<p>Och, es geht.</p>
<pre><code class="language-cpp">template &lt;typename T&gt; struct identity { typedef T type; };

template &lt;typename T, bool B&gt; struct val_or_cref : identity&lt;T&gt; {};
template &lt;typename T&gt; struct val_or_cref&lt;T, false&gt; : identity&lt;T const&amp;&gt; {};

template &lt;typename T&gt; struct per_value_candidate
: std::integral_constant&lt;bool, std::is_pod&lt;T&gt;::value &amp;&amp; sizeof(T)&lt;=sizeof(void*)&gt; {};

template &lt;typename T,
          bool PerValue = per_value_candidate&lt;T&gt;::value&gt;
T calc(typename val_or_cref&lt;T, PerValue&gt;::type t)
{
  std::cout &lt;&lt;
    (std::is_reference&lt;typename val_or_cref&lt;T, PerValue&gt;::type&gt;::value
     ? &quot;per const-ref&quot; : &quot;per value&quot;) &lt;&lt; '\n';
  return t;
}

int main()
{
  calc&lt;int&gt;(4);
  calc&lt;std::string&gt;(&quot;x&quot;);
  calc&lt;int*&gt;(0);
}
</code></pre>
<p>Mich stört eher, dass T nicht mehr deduziert werden kann. Deshalb würde ich das niemals so machen und mich auf den Compiler verlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275172</guid><dc:creator><![CDATA[ochs]]></dc:creator><pubDate>Tue, 27 Nov 2012 15:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 15:09:51 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Du könntest auch was mit enable_if und is_fundamental basteln.</p>
<p><em>Edit: Ach, das hat der Sepp ja quasi schon geschrieben.</em></p>
</blockquote>
<p>Jetzt, wo du es erwähnst, fällt mir ein, dass ich mal ein <code>Select&lt;bool,typename,typename&gt;</code> geschrieben habe. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Daran hätte ich mal eher denken sollen, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275174</guid><dc:creator><![CDATA[Polynomteiler]]></dc:creator><pubDate>Tue, 27 Nov 2012 15:09:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 15:19:45 GMT]]></title><description><![CDATA[<p>Polynomteiler schrieb:</p>
<blockquote>
<p>Bringt es eigentlich wirklich so viel, Standardtypen und Iteratoren als Kopie anstatt als Referenz zu übergeben? Was daran effizienter sein soll, habe ich nie wirklich verstanden.</p>
</blockquote>
<p>Theoretisch bringt es sehr, sehr viel. Kannst dir ja mal den Unterschied überlegen zwischen einem Wert in einem Register und einem Zeiger auf den Wert. Praktisch wird's aber eh wegoptimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275177</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 27 Nov 2012 15:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 15:24:28 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Praktisch wird's aber eh wegoptimiert.</p>
</blockquote>
<p>Nur wenn die Funktion in der gleichen UE definiert wird. Das ist bei Templates zufällig der Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275180</guid><dc:creator><![CDATA[praktiker]]></dc:creator><pubDate>Tue, 27 Nov 2012 15:24:28 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 15:27:59 GMT]]></title><description><![CDATA[<p>Und wenn nicht könnte auch LTO greifen. Ansonsten haben Zeiger und Referenzen ohne Optimierung natürlich eine Indirektion mehr als eine Kopie, deren Auflösung Zeit kostet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275181</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 27 Nov 2012 15:27:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 15:32:16 GMT]]></title><description><![CDATA[<p>Ich werf mal einenspontanen Vorschlag in den Ring, mal gucken wer ihn zerreißt:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
    T calc(T&amp;&amp; t); //C++11 &quot;universal reference&quot;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2275184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275184</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 27 Nov 2012 15:32:16 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 15:33:18 GMT]]></title><description><![CDATA[<p>praktiker schrieb:</p>
<blockquote>
<p>Nur wenn die Funktion in der gleichen UE definiert wird. Das ist bei Templates zufällig der Fall.</p>
</blockquote>
<p>Ich nehme Compiler ohne Link-Time-Optimization eh nicht mehr ernst. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2275185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275185</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 27 Nov 2012 15:33:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 15:57:49 GMT]]></title><link>https://www.c-plusplus.net/forum/post/2275190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275190</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 27 Nov 2012 15:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 16:10:42 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/libs/1_52_0/libs/utility/call_traits.htm" rel="nofollow">Boost.CallTraits</a></p>
<p>Und verwende bitte nicht den Begriff &quot;konstante Referenz&quot;. Warum, erfährst du <a href="http://www.c-plusplus.net/forum/p2190437#2190437" rel="nofollow">hier</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275199</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 27 Nov 2012 16:10:42 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 16:12:54 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Polynomteiler schrieb:</p>
<blockquote>
<p>Bringt es eigentlich wirklich so viel, Standardtypen und Iteratoren als Kopie anstatt als Referenz zu übergeben? Was daran effizienter sein soll, habe ich nie wirklich verstanden.</p>
</blockquote>
<p>Theoretisch bringt es sehr, sehr viel. Kannst dir ja mal den Unterschied überlegen zwischen einem Wert in einem Register und einem Zeiger auf den Wert.</p>
</blockquote>
<p>Das. Außerdem ist ein per Value übergebenes Argument garantiert aliasfrei.</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Ich werf mal einenspontanen Vorschlag in den Ring, mal gucken wer ihn zerreißt:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
    T calc(T&amp;&amp; t); //C++11 &quot;universal reference&quot;
</code></pre>
</blockquote>
<p>Das ist immer noch eine Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275200</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 27 Nov 2012 16:12:54 GMT</pubDate></item><item><title><![CDATA[Reply to Kopie oder konstante Referenz? on Tue, 27 Nov 2012 20:05:33 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Ich werf mal einenspontanen Vorschlag in den Ring, mal gucken wer ihn zerreißt:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
    T calc(T&amp;&amp; t); //C++11 &quot;universal reference&quot;
</code></pre>
</blockquote>
<p>Das ist immer noch eine Referenz.</p>
</blockquote>
<p>Nicht nur das, sie ist auch nicht mal const, man kann also das Objekt darüber verändern, das bringt's irgendwie so gar nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2275276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2275276</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 27 Nov 2012 20:05:33 GMT</pubDate></item></channel></rss>