<?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[add assign]]></title><description><![CDATA[<p>hey</p>
<p>ich habe eine kleine - noch unbeantwortete - frage. folgernder code gibt 12 aus:</p>
<pre><code>template&lt;typename Derived&gt;
class MakeAddAssignable
{
protected:
	MakeAddAssignable()
	{
	}
public:
	Derived&amp; operator+= (Derived const&amp; Rhs)
	{
		*static_cast&lt;Derived*&gt;(this) = *static_cast&lt;Derived*&gt;(this) + Rhs;
		return *static_cast&lt;Derived*&gt;(this);
	}
};
struct Foo : MakeAddAssignable&lt;Foo&gt;
{
	Foo(int d = 0)
		: Data(d)
	{
	}
	int Data;
};
Foo operator+ (Foo lhs, Foo rhs)
{
	return lhs.Data + rhs.Data;
}
#include &lt;iostream&gt;
int main()
{
	Foo Data, b, c;
	b.Data = 5;
	c.Data = 7;
	Data += b;
	Data += c;
	std::cout &lt;&lt; Data.Data;
	std::cin.get();
}
</code></pre>
<p>ist das - egal wie &quot;Foo&quot; in einem richtigen programm konkret aussieht - definiert und well-formed? ich habe eben angst so einfach einen base-pointer in einen derived-pointer zu casten und bin mir gerade nicht sicher wie das geregelt ist. wenn es nicht geht, wie sonst soll man das lösen?</p>
<p>gruss</p>
<p>ps.: ja, es ist mir bewusst dass man eigentlich den += operator mit dem + operator implementiert. das müsst ihr mir gar nicht sagen. nun ist es aber teilweise effizienter es andersherum zu machen....</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322128/add-assign</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 08:07:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322128.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Dec 2013 01:46:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 01:46:07 GMT]]></title><description><![CDATA[<p>hey</p>
<p>ich habe eine kleine - noch unbeantwortete - frage. folgernder code gibt 12 aus:</p>
<pre><code>template&lt;typename Derived&gt;
class MakeAddAssignable
{
protected:
	MakeAddAssignable()
	{
	}
public:
	Derived&amp; operator+= (Derived const&amp; Rhs)
	{
		*static_cast&lt;Derived*&gt;(this) = *static_cast&lt;Derived*&gt;(this) + Rhs;
		return *static_cast&lt;Derived*&gt;(this);
	}
};
struct Foo : MakeAddAssignable&lt;Foo&gt;
{
	Foo(int d = 0)
		: Data(d)
	{
	}
	int Data;
};
Foo operator+ (Foo lhs, Foo rhs)
{
	return lhs.Data + rhs.Data;
}
#include &lt;iostream&gt;
int main()
{
	Foo Data, b, c;
	b.Data = 5;
	c.Data = 7;
	Data += b;
	Data += c;
	std::cout &lt;&lt; Data.Data;
	std::cin.get();
}
</code></pre>
<p>ist das - egal wie &quot;Foo&quot; in einem richtigen programm konkret aussieht - definiert und well-formed? ich habe eben angst so einfach einen base-pointer in einen derived-pointer zu casten und bin mir gerade nicht sicher wie das geregelt ist. wenn es nicht geht, wie sonst soll man das lösen?</p>
<p>gruss</p>
<p>ps.: ja, es ist mir bewusst dass man eigentlich den += operator mit dem + operator implementiert. das müsst ihr mir gar nicht sagen. nun ist es aber teilweise effizienter es andersherum zu machen....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370489</guid><dc:creator><![CDATA[asfsdfa]]></dc:creator><pubDate>Sun, 08 Dec 2013 01:46:07 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 02:50:50 GMT]]></title><description><![CDATA[<p>-&gt; CRTP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370493</guid><dc:creator><![CDATA[decimad]]></dc:creator><pubDate>Sun, 08 Dec 2013 02:50:50 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 11:05:12 GMT]]></title><description><![CDATA[<pre><code>#include &lt;iostream&gt;
#include &lt;type_traits&gt;

struct MakeAddAssignable {};

template&lt; typename T,
          typename = typename std::enable_if&lt;std::is_base_of&lt;MakeAddAssignable, T&gt;::value&gt;::type &gt;
T&amp; operator+=( T&amp; lhs, T const&amp; rhs)
{
	lhs = lhs + rhs;
	return lhs;
}

struct Foo : MakeAddAssignable
{
	Foo(int d = 0)
		: Data(d) {}

	int Data;
};

Foo operator+ (Foo lhs, Foo rhs)
{
	return lhs.Data + rhs.Data;
}

int main()
{
    Foo Data, b, c;
    b.Data = 5;
    c.Data = 7;
    Data += b;
    Data += c;
    std::cout &lt;&lt; Data.Data;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2370528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370528</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 08 Dec 2013 11:05:12 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 14:02:07 GMT]]></title><description><![CDATA[<p>vielen dank euch beiden, problem gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370552</guid><dc:creator><![CDATA[asfsdfa]]></dc:creator><pubDate>Sun, 08 Dec 2013 14:02:07 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 21:23:46 GMT]]></title><description><![CDATA[<p>Den operator+= ueber den operator+ zu implementieren ist aber generell eine sehr dumme idee.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370632</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 08 Dec 2013 21:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 21:28:54 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Den operator+= ueber den operator+ zu implementieren ist aber generell eine sehr dumme idee.</p>
</blockquote>
<p>Jo, immer umgekehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370633</guid><dc:creator><![CDATA[iA]]></dc:creator><pubDate>Sun, 08 Dec 2013 21:28:54 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 21:30:13 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Den operator+= ueber den operator+ zu implementieren ist aber generell eine sehr dumme idee.</p>
</blockquote>
<p>soll ich dafür unnötigen runtime overhead in kauf nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370634</guid><dc:creator><![CDATA[asfsdfa]]></dc:creator><pubDate>Sun, 08 Dec 2013 21:30:13 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 21:32:23 GMT]]></title><description><![CDATA[<p>asfsdfa schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Den operator+= ueber den operator+ zu implementieren ist aber generell eine sehr dumme idee.</p>
</blockquote>
<p>soll ich dafür unnötigen runtime overhead in kauf nehmen?</p>
</blockquote>
<p>du verdrehst da was. die dumme idee ist die unperformante. operator+= braucht kein temporary, operator+ erzeugt immer eins.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370635</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 08 Dec 2013 21:32:23 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 21:35:04 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>asfsdfa schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Den operator+= ueber den operator+ zu implementieren ist aber generell eine sehr dumme idee.</p>
</blockquote>
<p>soll ich dafür unnötigen runtime overhead in kauf nehmen?</p>
</blockquote>
<p>du verdrehst da was. die dumme idee ist die unperformante. operator+= braucht kein temporary, operator+ erzeugt immer eins.</p>
</blockquote>
<p>dass operator+= kein temporary braucht stimmt in gewissen fällen nicht. (bzw. es ist bei mir operator*=, aber alle beziehungen sind analog zu += und +).</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<p>otze schrieb:</p>
<blockquote>
<p>Es ist mir nicht klar, ob du matrix-produkt oder das elementweise-Produkt haben willst (beides wird je nach Sprache mit * notiert). adfasdfs gezeigter Code passt gut zum elementweisen produkt und wird so mit Sicherheit auch beim matrix-produkt funktionieren. Allerdings ist es beim echten Matrixprodukt besser wegen der Probleme mit der Matrixgröße sowie aliasing op <em>= mithilfe von op</em> zu implementieren, und nicht wie üblich umgekehrt. Das spart eine Kopie (du brauchst bei dem hier gezeigten Ansatz immer 2 temporäre Kopien bei Benutzung von op*)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29978">@Photon</a></p>
<p>das wird heir ja gemacht. Nur nicht dein Code für a*b sondern a*=b und dann wird a*b mithilfe dieses operators implmentiert mittels:</p>
<p>c=a<em>b<br />
=&gt;<br />
c=a;<br />
c</em>=b;</p>
</blockquote>
<p>aus <a href="http://www.c-plusplus.net/forum/quote2367771" rel="nofollow">http://www.c-plusplus.net/forum/quote2367771</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370636</guid><dc:creator><![CDATA[asfsdfa]]></dc:creator><pubDate>Sun, 08 Dec 2013 21:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 21:37:08 GMT]]></title><description><![CDATA[<p>ja, aber das gilt für Matrizen, nicht für Foo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370637</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 08 Dec 2013 21:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to add assign on Sun, 08 Dec 2013 21:40:03 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>ja, aber das gilt für Matrizen, nicht für Foo.</p>
</blockquote>
<p>foo war nur ein beispiel für eine klasse, bei der die unübliche reihenfolge performanter ist. ich habe auch schon lange basisklassen geschrieben die operator$ anhand von operator$= implementieren, die ich auch für fast alles einsetze. aber für diesen ausnahmefall wie matrizen möchte ich auch basisklassen anbieten. ich hoffe, nun hab ich mich verstänlicher erklären können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370639</guid><dc:creator><![CDATA[asfsdfa]]></dc:creator><pubDate>Sun, 08 Dec 2013 21:40:03 GMT</pubDate></item></channel></rss>