<?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[nichtkonstanter rückgabewert direkt verwenden]]></title><description><![CDATA[<p>Hi, liebe Gemeinde,<br />
ich möchte folgendes Szenario :</p>
<pre><code class="language-cpp">template&lt;class lhs , class rhs&gt;
class Wrapper{
  lhs &amp; LHS;
  rhs &amp; RHS;
public:

  Wrapper(lhs &amp; LHS, rhs &amp; RHS) : LHS(LHS), RHS(RHS) {}

/* IMPL... */
};

template&lt;class lhs , class rhs&gt;
inline Wrapper&lt;lhs,rhs&gt; operator+(lhs &amp; LHS, rhs &amp; RHS) {
  Wrapper&lt;lhs,rhs&gt; Result(LHS,RHS);
  /*.....*/
  return Result;
}

class Testclass {};

int main()
{
  Testclass A;
  Testclass B;
  Testclass C;

  A+B+C;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/275738/nichtkonstanter-rückgabewert-direkt-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 14:52:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275738.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Oct 2010 08:33:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 08:33:04 GMT]]></title><description><![CDATA[<p>Hi, liebe Gemeinde,<br />
ich möchte folgendes Szenario :</p>
<pre><code class="language-cpp">template&lt;class lhs , class rhs&gt;
class Wrapper{
  lhs &amp; LHS;
  rhs &amp; RHS;
public:

  Wrapper(lhs &amp; LHS, rhs &amp; RHS) : LHS(LHS), RHS(RHS) {}

/* IMPL... */
};

template&lt;class lhs , class rhs&gt;
inline Wrapper&lt;lhs,rhs&gt; operator+(lhs &amp; LHS, rhs &amp; RHS) {
  Wrapper&lt;lhs,rhs&gt; Result(LHS,RHS);
  /*.....*/
  return Result;
}

class Testclass {};

int main()
{
  Testclass A;
  Testclass B;
  Testclass C;

  A+B+C;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1967881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967881</guid><dc:creator><![CDATA[schnupfbear]]></dc:creator><pubDate>Wed, 20 Oct 2010 08:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 09:02:57 GMT]]></title><description><![CDATA[<p>ups. zu schnell abgeschickt.<br />
Möchte im Endeffekt das A+B+C direkt evaluiert und verwendet werden kann.<br />
Dadurch sollte man einfach eine Baumstruktur erstellen können zb. (A+B)+(C+(D+(E+F))).</p>
<p>E+F<br />
|/<br />
D+0<br />
|/<br />
C+0<br />
\|<br />
0<br />
A+B /<br />
\|/<br />
0</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967887</guid><dc:creator><![CDATA[Schnupfbear]]></dc:creator><pubDate>Wed, 20 Oct 2010 09:02:57 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 09:28:05 GMT]]></title><description><![CDATA[<p>misst die Leerzeichen wurden verschluckt...Tut mir Für Dreifachpost leid habe erst jetzt den Vorschaubutton entdeckt ;P<br />
Naja so könnte die Baumstruktur aussehen:<br />
---------------E+F<br />
---------------\-/<br />
------------D+0<br />
-------------\-/<br />
----------C+0<br />
----------\-/<br />
-----------0<br />
A+B-----/<br />
-\|-----/<br />
--0---/<br />
---\-/<br />
----0</p>
<p>LG Schnupfbear</p>
<p>ps gibt es kein Edit-Button?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967901</guid><dc:creator><![CDATA[Schnupfbear]]></dc:creator><pubDate>Wed, 20 Oct 2010 09:28:05 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 09:33:07 GMT]]></title><description><![CDATA[<p>Schnupfbear schrieb:</p>
<blockquote>
<p>misst die Leerzeichen wurden verschluckt...</p>
</blockquote>
<p>Verwende Code-Tags <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>Schnupfbear schrieb:</p>
<blockquote>
<p>ps gibt es kein Edit-Button?</p>
</blockquote>
<p>Wenn du registriert bist schon. Man kann die einzelnen Unregistrierten nicht unterscheiden, daher auch keine Edit-Möglichkeiten anbieten.</p>
<p>Und was ist deine Frage? <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="🙂"
    /><br />
Deine Wrapper-Klasse ist nicht kopierbar, falls dies das Problem ist, weil du darin Referenzen als Member verwendest.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967902</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 20 Oct 2010 09:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 09:39:47 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Schnupfbear schrieb:</p>
<blockquote>
<p>misst die Leerzeichen wurden verschluckt...</p>
</blockquote>
<p>Verwende Code-Tags <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>Schnupfbear schrieb:</p>
<blockquote>
<p>ps gibt es kein Edit-Button?</p>
</blockquote>
<p>Wenn du registriert bist schon. Man kann die einzelnen Unregistrierten nicht unterscheiden, daher auch keine Edit-Möglichkeiten anbieten.</p>
<p>Und was ist deine Frage? <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="🙂"
    /><br />
Deine Wrapper-Klasse ist nicht kopierbar, falls dies das Problem ist, weil du darin Referenzen als Member verwendest.</p>
<p>Grüssli</p>
</blockquote>
<p>Und gibt es kein Workaround damit das Wrapperobjekt beschreibbar zurückgegeben wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967907</guid><dc:creator><![CDATA[Schnupfbear]]></dc:creator><pubDate>Wed, 20 Oct 2010 09:39:47 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 09:56:21 GMT]]></title><description><![CDATA[<p>Speichere Zeiger statt Referenzen. Allerdings wird das in einer Katastrophe enden, weil du dann Zeiger auf temporäre Objekte speicherst und wohl später darauf zugreifen möchtest. Wenn du dir zum Beispiel mal die folgende Auswertung ansiehst:</p>
<ol>
<li><code>B+C</code> gibt ein temporäres Objekt vom Typ <code>Wrapper&lt;TestClass, TestClass&gt;</code> zurück. Es speichert intern Zeiger auf <code>B</code> und <code>C</code> . Noch ist alles in Ordnung.</li>
<li><code>A+</code> (1.) gibt ein <code>Wrapper&lt;TestClass, Wrapper&lt;TestClass, TestClass&gt; &gt;</code> zurück. <code>LHS</code> zeigt auf <code>A</code> , was kein Problem ist. <code>RHS</code> zeigt dann allerdings auf das temporäre Objekt, welches bei 1. erzeugt und grundsätzlich auch gleich wieder zerstört wurde. Jeglicher spätere Zugriff darauf resultiert in undefiniertem Verhalten.</li>
</ol>
<p>Dir bleibt somit nichts anderes übrig, als dass du Kopien machst oder einen C++0x Compiler mit Move-Konstruktoren verwendest.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967915</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 20 Oct 2010 09:56:21 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 10:13:05 GMT]]></title><description><![CDATA[<p>Der aktuelle operator+ dürfte doch auch gar nicht kompilieren: Du nimmst non-const-Referenzen als Paramater entgegen, rufst die Funktion dann aber mit temporären Objekten auf. -&gt; Error. Mit const-Referenzen würde das mit temporären Objekten wieder gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967919</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 20 Oct 2010 10:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 10:43:47 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Der aktuelle operator+ dürfte doch auch gar nicht kompilieren: Du nimmst non-const-Referenzen als Paramater entgegen, rufst die Funktion dann aber mit temporären Objekten auf. -&gt; Error. Mit const-Referenzen würde das mit temporären Objekten wieder gehen.</p>
</blockquote>
<p>Richtig...deswegen frage ich ja um Rat...<br />
Ich brauche nämlich nicht Konstante Rückgabewerte damit ich später die Daten noch verändern kann;<br />
Gebe ich direkt eine Referenz, dann endet es direkt, wie Dravere es beschrieben hat, in einer Katastrophe.</p>
<p>Das mit dem Move-konstruktor klingt viel versprechend. Habe mich da auch schon etwas eingelesen aber wie genau ich das,in diesem Beispiel mit den RValues machen soll, weis ich noch nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967930</guid><dc:creator><![CDATA[Schnupfbear]]></dc:creator><pubDate>Wed, 20 Oct 2010 10:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 10:58:19 GMT]]></title><description><![CDATA[<p>Was spricht dagegen, einfach Werte zu verwenden? Keine Zeiger, keine Referenzen einfach Werte. Wenn sich im Nachhinein herausstellt, dass dies für einige Type zu inperformant ist (nach dem man gemessen hat, dass genau dass, das Problem ist), kann man den Type auf einfaches Kopieren hin optimieren.</p>
<p>mfg Torsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967939</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 20 Oct 2010 10:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 12:03:05 GMT]]></title><description><![CDATA[<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Was spricht dagegen, einfach Werte zu verwenden? Keine Zeiger, keine Referenzen einfach Werte. Wenn sich im Nachhinein herausstellt, dass dies für einige Type zu inperformant ist (nach dem man gemessen hat, dass genau dass, das Problem ist), kann man den Type auf einfaches Kopieren hin optimieren.<br />
mfg Torsten</p>
</blockquote>
<p>&quot;Testtype&quot; ist der &quot;Wert&quot; und er ist ziemlich groß; kopieren kommt da nicht in Frage.<br />
&quot;Wrapper&quot; dient letzendlich dazu, die &quot;Werte&quot; zu Ordnen und für &quot;Templatemagie&quot; aufzubereiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967976</guid><dc:creator><![CDATA[Schnupfbear]]></dc:creator><pubDate>Wed, 20 Oct 2010 12:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Wed, 20 Oct 2010 12:08:05 GMT]]></title><description><![CDATA[<p>Schnupfbear schrieb:</p>
<blockquote>
<p>&quot;Testtype&quot; ist der &quot;Wert&quot; und er ist ziemlich groß; kopieren kommt da nicht in Frage.</p>
</blockquote>
<p>Dann optimiere den Typen doch für Kopieren. &quot;copy on write&quot; (COW) wäre da z.B. ein Stichwort. Du trennst den Typen in ein Body und ein Handel, wobei der Body mit einem Referenzzähler versehen ist. Bei schreibenden Zugriffen auf den Body über das Handle, guckst Du, ob der Body mehr als einmal referenziert wird. Ist dem so, machst Du Dir Deine eigene Kopie des Bodies. Der copy c'tor des handles sieht dann so aus, dass er den Zeiger auf den Body kopiert und dort die Anzahl der Referenzen um eins erhöht.</p>
<p>mfg Torsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967978</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 20 Oct 2010 12:08:05 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Fri, 22 Oct 2010 09:54:30 GMT]]></title><description><![CDATA[<p>Wie wärs damit?</p>
<pre><code class="language-cpp">class IWrapper{};
template&lt;class lhs , class rhs&gt;
class Wrapper : IWrapper
{
  lhs &amp; LHS;
  rhs &amp; RHS;
public:

  Wrapper(lhs &amp; LHS, rhs &amp; RHS) : LHS(LHS), RHS(RHS) {}

/* IMPL... */
};

template&lt;class lhs , class rhs, bool L = std::is_base_of&lt;IWrapper,lhs&gt;::value,  bool R = std::is_base_of&lt;IWrapper,lhs&gt;::value &gt;
inline typename
std::enable_if&lt; !(L||R), Wrapper&lt;lhs,rhs&gt; &gt;
::type&amp;&amp; operator+(lhs &amp; LHS, rhs &amp; RHS) {
  Wrapper&lt;lhs,rhs&gt; Result(LHS,RHS);
  /*.....*/
  return std::move(Result);
}

template&lt;class lhs , class rhs, bool L = std::is_base_of&lt;IWrapper,lhs&gt;::value,  bool R = std::is_base_of&lt;IWrapper,lhs&gt;::value &gt;
inline typename
std::enable_if&lt; (!L&amp;&amp;R), Wrapper&lt;lhs,rhs&gt; &gt;
::type&amp;&amp; operator+(lhs &amp; LHS, rhs  RHS) {
  Wrapper&lt;lhs,rhs&gt; Result(LHS,RHS);
  /*.....*/
  return std::move(Result);
}

template&lt;class lhs , class rhs, bool L = std::is_base_of&lt;IWrapper,lhs&gt;::value,  bool R = std::is_base_of&lt;IWrapper,lhs&gt;::value &gt;
inline typename
std::enable_if&lt; (L&amp;&amp;!R), Wrapper&lt;lhs,rhs&gt; &gt;
::type&amp;&amp; operator+(lhs LHS, rhs &amp; RHS) {
  Wrapper&lt;lhs,rhs&gt; Result(LHS,RHS);
  /*.....*/
  return std::move(Result);
}

template&lt;class lhs , class rhs, bool L = std::is_base_of&lt;IWrapper,lhs&gt;::value,  bool R = std::is_base_of&lt;IWrapper,lhs&gt;::value &gt;
inline typename
std::enable_if&lt; (L&amp;&amp;R), Wrapper&lt;lhs,rhs&gt; &gt;
::type&amp;&amp; operator+(lhs  LHS, rhs  RHS) {
  Wrapper&lt;lhs,rhs&gt; Result(LHS,RHS);
  /*.....*/
  return std::move(Result);
}

class Testclass {};

int main()
{
  Testclass A;
  Testclass B;
  Testclass C;

  A+B+C;
}
</code></pre>
<p>Hat jemand ne elegantere Möglichkeit gefunden? - was wenns mehr als 2 Argumente sind?<br />
Das hat leider nicht funktioniert, der Compiler war stets nicht in der lage die Funktion zu finden(auser man gibt die Parameter explizit an):</p>
<pre><code class="language-cpp">template&lt;bool Cond, class A, class B&gt;
struct IF
{
  typedef A type;
};

template&lt;bool Cond, class A, class B&gt;
struct IF&lt;false,A,B&gt;
{
  typedef B type;
};

template&lt;class lhs , class rhs, bool L = std::is_base_of&lt;IWrapper,lhs&gt;::value,  bool R = std::is_base_of&lt;IWrapper,lhs&gt;::value &gt;
Wrapper&lt;lhs,rhs&gt; operator+( typename IF&lt;L,lhs&amp;,lhs&gt;::type LHS , typename IF&lt;R,rhs&amp;,rhs&gt;::type RHS )
</code></pre>
<p>MFG<br />
Speed</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1968967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1968967</guid><dc:creator><![CDATA[Speed]]></dc:creator><pubDate>Fri, 22 Oct 2010 09:54:30 GMT</pubDate></item><item><title><![CDATA[Reply to nichtkonstanter rückgabewert direkt verwenden on Sat, 23 Oct 2010 10:12:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20892">@Speed</a> : funktioniert leider nur wenn Compiler-Optimierungen aktiviert sind(G++-4.5)</p>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Dann optimiere den Typen doch für Kopieren. &quot;copy on write&quot; (COW) wäre da z.B. ein Stichwort. Du trennst den Typen in ein Body und ein Handel, wobei der Body mit einem Referenzzähler versehen ist. Bei schreibenden Zugriffen auf den Body über das Handle, guckst Du, ob der Body mehr als einmal referenziert wird. Ist dem so, machst Du Dir Deine eigene Kopie des Bodies. Der copy c'tor des handles sieht dann so aus, dass er den Zeiger auf den Body kopiert und dort die Anzahl der Referenzen um eins erhöht.<br />
mfg Torsten</p>
</blockquote>
<p>Sehe es irgendwie nicht ein wieso ich ein Kopieroverhead in kauf nehmen soll, obwohl der Compiler ja tun könnte(könnte er?:-), was ich möchte.</p>
<p>Der Code Funktioniert ja, wenn man ihn in Zwischenschritte aufspaltet und die Ergebnisse einer Variable zuweist(ist uns sogar lieber, als viel rumzukopieren):</p>
<pre><code class="language-cpp">auto X = A+B;
auto Y = X+C;
auto Z = Y+D;
//usw
</code></pre>
<p>Dann sollte man vielleicht wissen, dass eigentlich &quot;Wrapper&quot; dazu eingeführt worden ist, um ein paar Features durch &quot;template-Magie&quot; zu ermöglichen - ohne Kopieren zu müssen. Jetzt wollten wir zusätzliche Features, mit Schreiboperationen, einführen, da entschloss ich im &quot;operator+&quot; das &quot;const&amp;&quot; in &quot;&amp;&quot; umzuschreiben... naja und dann bin ich hierher gelandet ;P</p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1969417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969417</guid><dc:creator><![CDATA[Schnupfbear]]></dc:creator><pubDate>Sat, 23 Oct 2010 10:12:33 GMT</pubDate></item></channel></rss>