<?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[asgn_facade nicht möglich (gcc)?]]></title><description><![CDATA[<p>ein technisch etwas kompliziertere aber wahrscheinlich<br />
schnell zu beantwortende frage in bezug auf facades.</p>
<p>die assignment funktionalität einer klasse soll in eine<br />
facade ausgelagert werden, die ihrerseits wiederum auf<br />
einen zentralen handler zugreift, der sich um das asign-<br />
ment von irgendwelchen klassen kümmert.</p>
<p>als erstes mal wieder eine dummy klasse :</p>
<pre><code class="language-cpp">class dummy : public asgn_facade&lt;dummy&gt;{
public:
   dummy();
};
</code></pre>
<p>jetzt die asgn_facade</p>
<pre><code class="language-cpp">template &lt;typename base_t&gt;
struct asgn_facade{
   inline typename asgn_handler&lt;base_t&amp;,const base_t&amp;&gt;::result_type
   operator=(const base_t&amp; rhs){
       return asgn_handler&lt;base_t&amp;,const base_t&amp;&gt;::make(
          *static_cast&lt;base_t*&gt;(this),rhs);
   }

   template &lt;typename rhs_t&gt;
   inline typename asgn_handler&lt;base_t&amp;,const rhs_t&amp;&gt;::result_type
   operator=(const rhs_t&amp; rhs){
        return asgn_handler&lt;base_t&amp;,const rhs_t&amp;&gt;::make(
           *static_cast&lt;base_t*&gt;(this),rhs);
   }
};
</code></pre>
<p>wie man sieht lenkt die facade den zugriff auf die assignment operatoren<br />
nur auf den asgn_handler um, deswegen jetzt der asgn_handler, dabei inter-<br />
essiert aber die konkrete implementierung nicht :</p>
<pre><code class="language-cpp">template &lt;typename,typename&gt;
struct asgn_handler;

template &lt;&gt;
struct asgn_handler&lt;dummy&amp;,const dummy&amp;&gt;{
   typedef dummy&amp; result_type;

   static inline result_type
   make(dummy&amp;,const dummy&amp;);
};

template &lt;typename rhs_t&gt;
struct asgn_handler&lt;dummy&amp;,const rhs_t&amp;&gt;{
   typedef dummy&amp; result_type;

   static inline result_type
   make(dummy&amp;,const rhs_t&amp;);
};
</code></pre>
<p>;</p>
<p>eigentlich sollte jetzt jede art von assignment der klasse dummy über die<br />
asgn_facade umgeleitet werden auf den zugehörigen asgn_handler. das funk-<br />
tioniert für normales assignment auch, d.h.</p>
<pre><code class="language-cpp">dummy d1, d2;
d1 = d2; // funzt
</code></pre>
<p>für den general assignment operator ist er aber nicht in der lage das<br />
ganze aufzulösen, sondern findet nur den normalen assignment operator :</p>
<pre><code class="language-cpp">d1 = 1; // -&gt; compile-time-error
</code></pre>
<p>was mich zu der frage bringt, ob assignment operatoren analog zu kon-<br />
struktoren, die funktionalitäts elemente einer klasse sind, die man<br />
leider nicht in eine facade auslagern kann.</p>
<p>was mich dabei aber wundert : man kann z.b. den operator+= in eine<br />
plus_asgn_facade auslagern, ohne das es probleme gibt.</p>
<p>danke, ingo.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195599/asgn_facade-nicht-möglich-gcc</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 04:57:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195599.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Oct 2007 12:37:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to asgn_facade nicht möglich (gcc)? on Fri, 19 Oct 2007 12:37:13 GMT]]></title><description><![CDATA[<p>ein technisch etwas kompliziertere aber wahrscheinlich<br />
schnell zu beantwortende frage in bezug auf facades.</p>
<p>die assignment funktionalität einer klasse soll in eine<br />
facade ausgelagert werden, die ihrerseits wiederum auf<br />
einen zentralen handler zugreift, der sich um das asign-<br />
ment von irgendwelchen klassen kümmert.</p>
<p>als erstes mal wieder eine dummy klasse :</p>
<pre><code class="language-cpp">class dummy : public asgn_facade&lt;dummy&gt;{
public:
   dummy();
};
</code></pre>
<p>jetzt die asgn_facade</p>
<pre><code class="language-cpp">template &lt;typename base_t&gt;
struct asgn_facade{
   inline typename asgn_handler&lt;base_t&amp;,const base_t&amp;&gt;::result_type
   operator=(const base_t&amp; rhs){
       return asgn_handler&lt;base_t&amp;,const base_t&amp;&gt;::make(
          *static_cast&lt;base_t*&gt;(this),rhs);
   }

   template &lt;typename rhs_t&gt;
   inline typename asgn_handler&lt;base_t&amp;,const rhs_t&amp;&gt;::result_type
   operator=(const rhs_t&amp; rhs){
        return asgn_handler&lt;base_t&amp;,const rhs_t&amp;&gt;::make(
           *static_cast&lt;base_t*&gt;(this),rhs);
   }
};
</code></pre>
<p>wie man sieht lenkt die facade den zugriff auf die assignment operatoren<br />
nur auf den asgn_handler um, deswegen jetzt der asgn_handler, dabei inter-<br />
essiert aber die konkrete implementierung nicht :</p>
<pre><code class="language-cpp">template &lt;typename,typename&gt;
struct asgn_handler;

template &lt;&gt;
struct asgn_handler&lt;dummy&amp;,const dummy&amp;&gt;{
   typedef dummy&amp; result_type;

   static inline result_type
   make(dummy&amp;,const dummy&amp;);
};

template &lt;typename rhs_t&gt;
struct asgn_handler&lt;dummy&amp;,const rhs_t&amp;&gt;{
   typedef dummy&amp; result_type;

   static inline result_type
   make(dummy&amp;,const rhs_t&amp;);
};
</code></pre>
<p>;</p>
<p>eigentlich sollte jetzt jede art von assignment der klasse dummy über die<br />
asgn_facade umgeleitet werden auf den zugehörigen asgn_handler. das funk-<br />
tioniert für normales assignment auch, d.h.</p>
<pre><code class="language-cpp">dummy d1, d2;
d1 = d2; // funzt
</code></pre>
<p>für den general assignment operator ist er aber nicht in der lage das<br />
ganze aufzulösen, sondern findet nur den normalen assignment operator :</p>
<pre><code class="language-cpp">d1 = 1; // -&gt; compile-time-error
</code></pre>
<p>was mich zu der frage bringt, ob assignment operatoren analog zu kon-<br />
struktoren, die funktionalitäts elemente einer klasse sind, die man<br />
leider nicht in eine facade auslagern kann.</p>
<p>was mich dabei aber wundert : man kann z.b. den operator+= in eine<br />
plus_asgn_facade auslagern, ohne das es probleme gibt.</p>
<p>danke, ingo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1388526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1388526</guid><dc:creator><![CDATA[loehken]]></dc:creator><pubDate>Fri, 19 Oct 2007 12:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to asgn_facade nicht möglich (gcc)? on Mon, 22 Oct 2007 05:59:25 GMT]]></title><description><![CDATA[<p>Hmm wenn du deine Frage für den Ottonormalentwickler verständlich ausdrücken würdest könnte man auch Verstehen was du willst...</p>
<p>So im allgemeinen gesehen könntest du das Problem mal ohne Template beschreiben..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389704</guid><dc:creator><![CDATA[MathiasTemp]]></dc:creator><pubDate>Mon, 22 Oct 2007 05:59:25 GMT</pubDate></item><item><title><![CDATA[Reply to asgn_facade nicht möglich (gcc)? on Mon, 22 Oct 2007 13:27:08 GMT]]></title><description><![CDATA[<p>MathiasTemp schrieb:</p>
<blockquote>
<p>Hmm wenn du deine Frage für den Ottonormalentwickler verständlich ausdrücken würdest könnte man auch Verstehen was du willst...</p>
<p>So im allgemeinen gesehen könntest du das Problem mal ohne Template beschreiben..</p>
</blockquote>
<p>Das Problem bei der Sache ist, dass man die templates braucht, da man<br />
ansonsten das curious-recurring-template pattern nicht verwenden kann,<br />
dass man für die facade jeweils braucht. man kann natürlich den<br />
asgn_handler weglassen, dann wirds etwas einfacher.</p>
<p>egal, hab mich damit abgefunden, dass assignment als auf konstruktoren<br />
die einzigen elemente einer klasse sind, die sich nicht in verallgemeinerte<br />
facades auslagern lassen, dann muss man wohl leider immer das assignment<br />
schreiben, obwohl es redundanter code ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389975</guid><dc:creator><![CDATA[lohken]]></dc:creator><pubDate>Mon, 22 Oct 2007 13:27:08 GMT</pubDate></item></channel></rss>