<?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[templates  mit zirkulärer Abhängigkeit]]></title><description><![CDATA[<p>Ich versuch' grad folgendes:</p>
<p>Ich habe einen Satz von Funktoren</p>
<pre><code class="language-cpp">struct isX { bool operator()(char c) { ... }  }
struct isY { bool operator()(char c) { ... }  }
</code></pre>
<p>Die will ich mit &amp;&amp;, || und ! zu neuen Funktoren zusammenbauen:</p>
<pre><code class="language-cpp">template &lt;typename A, typename B&gt;
struct is_AND
{
   A a; B b;
   is_AND(A a_, B b_) : a(a_), b(b_) {}
   bool operator()(char c) { return a(c) &amp;&amp; b(c); }
}
</code></pre>
<p>Soweit funktioniert noch alles.<br />
<strong>Mein Problem:</strong></p>
<p>Wie definiere ich jetzt die überladenen Operatoren?<br />
Ich hab folgendes versucht:</p>
<pre><code class="language-cpp">template &lt;typename Derived&gt;
struct is_Logical
{
   is_NOT&lt;Derived&gt; operator!() 
   { return is_NOT&lt;Derived&gt;( *static_cast&lt;Derived *&gt;(this)); }

   template &lt;typename RHS&gt;
   is_AND&lt;Derived, RHS&gt; operator &amp;&amp; (RHS rhs) const 
   { return is_AND&lt;Derived, RHS&gt;(*static_cast&lt;Derived *&gt;(this), rhs); }

   template &lt;typename RHS&gt;
   is_OR&lt;Derived, RHS&gt; operator || (RHS rhs) 
   { return is_OR&lt;Derived, RHS&gt;(*static_cast&lt;Derived *&gt;(this), rhs); }
};
</code></pre>
<p>und leite die isX davon ab:</p>
<pre><code class="language-cpp">struct isX : public is_Logical&lt;isX&gt;
{
  bool operator isX()(char c) { ... }
}
</code></pre>
<p>Das klappt zwar auf der ersten Stufe ( (isX() &amp;&amp; isY() ) - aber dem Ergebnis is_AND&lt;isX, isY&gt; fehlen natürlich die operatoren, also z.B. (!isX() &amp;&amp; !isY()) funktioniert nicht.</p>
<p>Wie pack' ich die da rein?</p>
<p>:grübel:</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/154660/templates-mit-zirkulärer-abhängigkeit</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 00:33:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154660.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Jul 2006 10:07:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to templates  mit zirkulärer Abhängigkeit on Sat, 29 Jul 2006 10:12:25 GMT]]></title><description><![CDATA[<p>Ich versuch' grad folgendes:</p>
<p>Ich habe einen Satz von Funktoren</p>
<pre><code class="language-cpp">struct isX { bool operator()(char c) { ... }  }
struct isY { bool operator()(char c) { ... }  }
</code></pre>
<p>Die will ich mit &amp;&amp;, || und ! zu neuen Funktoren zusammenbauen:</p>
<pre><code class="language-cpp">template &lt;typename A, typename B&gt;
struct is_AND
{
   A a; B b;
   is_AND(A a_, B b_) : a(a_), b(b_) {}
   bool operator()(char c) { return a(c) &amp;&amp; b(c); }
}
</code></pre>
<p>Soweit funktioniert noch alles.<br />
<strong>Mein Problem:</strong></p>
<p>Wie definiere ich jetzt die überladenen Operatoren?<br />
Ich hab folgendes versucht:</p>
<pre><code class="language-cpp">template &lt;typename Derived&gt;
struct is_Logical
{
   is_NOT&lt;Derived&gt; operator!() 
   { return is_NOT&lt;Derived&gt;( *static_cast&lt;Derived *&gt;(this)); }

   template &lt;typename RHS&gt;
   is_AND&lt;Derived, RHS&gt; operator &amp;&amp; (RHS rhs) const 
   { return is_AND&lt;Derived, RHS&gt;(*static_cast&lt;Derived *&gt;(this), rhs); }

   template &lt;typename RHS&gt;
   is_OR&lt;Derived, RHS&gt; operator || (RHS rhs) 
   { return is_OR&lt;Derived, RHS&gt;(*static_cast&lt;Derived *&gt;(this), rhs); }
};
</code></pre>
<p>und leite die isX davon ab:</p>
<pre><code class="language-cpp">struct isX : public is_Logical&lt;isX&gt;
{
  bool operator isX()(char c) { ... }
}
</code></pre>
<p>Das klappt zwar auf der ersten Stufe ( (isX() &amp;&amp; isY() ) - aber dem Ergebnis is_AND&lt;isX, isY&gt; fehlen natürlich die operatoren, also z.B. (!isX() &amp;&amp; !isY()) funktioniert nicht.</p>
<p>Wie pack' ich die da rein?</p>
<p>:grübel:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1106545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106545</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Sat, 29 Jul 2006 10:12:25 GMT</pubDate></item><item><title><![CDATA[Reply to templates  mit zirkulärer Abhängigkeit on Sat, 29 Jul 2006 17:41:55 GMT]]></title><description><![CDATA[<p>Hast du schon versucht, is_AND von isLogical (btw, ziemlich verwirrende Namen) abzuleiten? Vorwärtsdeklarationen gibts auch für Templates:</p>
<pre><code class="language-cpp">template &lt;typename Derived&gt;
struct isLogical;

template &lt;typename A, typename B&gt;
struct is_AND : public isLogical&lt;is_AND&lt;A,B&gt; &gt;
{
   A a; B b;
   is_AND(A a_, B b_) : a(a_), b(b_) {}
   bool operator()(char c) { return a(c) &amp;&amp; b(c); }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1106804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106804</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 29 Jul 2006 17:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to templates  mit zirkulärer Abhängigkeit on Sat, 29 Jul 2006 17:38:03 GMT]]></title><description><![CDATA[<p>klappt <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 />
Hatte ich gar nicht erst versucht, weil forward für eine &quot;normale&quot; Basisklasse ja nicht reicht. Danke!</p>
<blockquote>
<p>btw, ziemlich verwirrende Namen</p>
</blockquote>
<p>Sorry, das origonal ist noch schlimmer <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="🙂"
    /> War halt so 'ne fixe Idee, ich wollte aber erst aufräumen wenn ich es wirklich zum laufen bekkomme</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1106821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1106821</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Sat, 29 Jul 2006 17:38:03 GMT</pubDate></item></channel></rss>