<?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[[Gelöst] Wie Prädikat formulieren bei boost::mpl::find_if mit placeholdern?]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>möchte ein Prädikat für den Einsatz in boost::mpl::find_if programmieren, bei dem auch ein Parameter mit einem placeholdern gesetzt wird, wie hier z.B.</p>
<pre><code class="language-cpp">typedef vector&lt;char,int,unsigned,long,unsigned long&gt; types;
typedef find_if&lt;types, is_same&lt;_1,unsigned&gt; &gt;::type iter;

BOOST_MPL_ASSERT(( is_same&lt; deref&lt;iter&gt;::type, unsigned &gt; ));
</code></pre>
<p>Jetzt will ich aber nicht auf den Typ vergleichen, der im Vector direkt zugreifbar ist, sondern auf einen eingekapselten Typ.</p>
<pre><code class="language-cpp">template&lt;int i&gt;
struct Slot {
    typedef Slot type;
    typedef int_&lt;i&gt; hold_type;
};
typedef vector&lt;Slot&lt;0&gt;, Slot&lt;10&gt;, Slot&lt;15&gt; &gt; slots;
typedef find_if&lt;slots, equal&lt; _1, int_&lt;10&gt; &gt; &gt;::type t10;

BOOST_MPL_ASSERT(( is_same&lt; deref&lt;t10&gt;::type, Slot&lt;10&gt; &gt; ));
</code></pre>
<p>Die Frage ist nun, wie ich dieses &quot;equal&quot; zu programmieren habe. Ich mache scheinbar immer irgend etwas falsch.</p>
<p>Wenn ich statt des &quot;equal&lt; _1, int_&lt;10&gt; &gt;&quot; auf &quot;equal&lt;int_&lt;10&gt; &gt;&quot; umschreibe, wobei dieses dann eine Metafunktionsklasse ist und sie so implementiere</p>
<pre><code class="language-cpp">template&lt;typename Nr&gt;
struct equal {
   template &lt;typename Slot&gt;
   struct apply : ::boost::is_same&lt; typename Slot::hold_type, Nr &gt; {};
};
</code></pre>
<p>, funktioniert es wie es soll.</p>
<p>Ich würde es aber halt auch gern mal mit placeholdern hinbekommen und diese damit richtig verstehen. Gelingt mir aber nicht. Ich hoffe einer von euch C++-Gurus kann mir da weiter helfen.</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274027/gelöst-wie-prädikat-formulieren-bei-boost-mpl-find_if-mit-placeholdern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 18:59:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274027.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Sep 2010 18:21:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Gelöst] Wie Prädikat formulieren bei boost::mpl::find_if mit placeholdern? on Tue, 21 Sep 2010 19:17:46 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>möchte ein Prädikat für den Einsatz in boost::mpl::find_if programmieren, bei dem auch ein Parameter mit einem placeholdern gesetzt wird, wie hier z.B.</p>
<pre><code class="language-cpp">typedef vector&lt;char,int,unsigned,long,unsigned long&gt; types;
typedef find_if&lt;types, is_same&lt;_1,unsigned&gt; &gt;::type iter;

BOOST_MPL_ASSERT(( is_same&lt; deref&lt;iter&gt;::type, unsigned &gt; ));
</code></pre>
<p>Jetzt will ich aber nicht auf den Typ vergleichen, der im Vector direkt zugreifbar ist, sondern auf einen eingekapselten Typ.</p>
<pre><code class="language-cpp">template&lt;int i&gt;
struct Slot {
    typedef Slot type;
    typedef int_&lt;i&gt; hold_type;
};
typedef vector&lt;Slot&lt;0&gt;, Slot&lt;10&gt;, Slot&lt;15&gt; &gt; slots;
typedef find_if&lt;slots, equal&lt; _1, int_&lt;10&gt; &gt; &gt;::type t10;

BOOST_MPL_ASSERT(( is_same&lt; deref&lt;t10&gt;::type, Slot&lt;10&gt; &gt; ));
</code></pre>
<p>Die Frage ist nun, wie ich dieses &quot;equal&quot; zu programmieren habe. Ich mache scheinbar immer irgend etwas falsch.</p>
<p>Wenn ich statt des &quot;equal&lt; _1, int_&lt;10&gt; &gt;&quot; auf &quot;equal&lt;int_&lt;10&gt; &gt;&quot; umschreibe, wobei dieses dann eine Metafunktionsklasse ist und sie so implementiere</p>
<pre><code class="language-cpp">template&lt;typename Nr&gt;
struct equal {
   template &lt;typename Slot&gt;
   struct apply : ::boost::is_same&lt; typename Slot::hold_type, Nr &gt; {};
};
</code></pre>
<p>, funktioniert es wie es soll.</p>
<p>Ich würde es aber halt auch gern mal mit placeholdern hinbekommen und diese damit richtig verstehen. Gelingt mir aber nicht. Ich hoffe einer von euch C++-Gurus kann mir da weiter helfen.</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953948</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Tue, 21 Sep 2010 19:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Wie Prädikat formulieren bei boost::mpl::find_if mit placeholdern? on Sat, 18 Sep 2010 13:52:18 GMT]]></title><description><![CDATA[<p>Hat denn wirklich keiner weiter eine Idee wie man dieses anstellen könnte?</p>
<p>Was ich jetzt versuchte habe ist folgendes:</p>
<pre><code class="language-cpp">struct equal2 {
    template&lt;typename A, typename B&gt;
    struct apply : is_same&lt; typename A::hold_type,B&gt;::type {};
};
typedef vector&lt;Slot&lt;0&gt;, Slot&lt;10&gt;, Slot&lt;15&gt; &gt; slots;
typedef find_if&lt;slots, bind&lt; equal2, _1, int_&lt;10&gt; &gt; &gt;::type t10;
BOOST_MPL_ASSERT(( is_same&lt; deref&lt;t10&gt;::type, Slot&lt;10&gt; &gt; ));
</code></pre>
<p>Dieses funktioniert, aber der placeholder ist halt nicht direkt ein Argument wie beim Standardbeispiel von find_if. Die Bindung des placeholders arbeitet jetzt über bind und damit wird dann mein equal2 richtig mit dem Argument der Sequence anstatt dem placeholder aufgerufen. Wie ich es aber direkt hinbekomme, habe ich leider keinen Plan. Außerdem ist equal2 auch eine Metafunktionsklasse und ich würde es auch gern mit einer einfachen Metafunktion hinbekommen. So wie bei is_same aus meinem ersten Posting beispielsweise.</p>
<p>Irgendwelche Hinweise, was man da machen könnte oder wo der Hacken ist an meinem Vorgehen.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954130</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Sat, 18 Sep 2010 13:52:18 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] Wie Prädikat formulieren bei boost::mpl::find_if mit placeholdern? on Tue, 21 Sep 2010 19:17:06 GMT]]></title><description><![CDATA[<p>Hi Forum,</p>
<p>ich habe es hin bekommen <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="😃"
    /> Nachdem ich mir den Quelltext von MPL <strong>etwas</strong> genauer angesehen habe, weiß ich wie es funktioniert und damit der Thread als gelöst gekennzeichnet werden kann, will ich mal den Weg aufzeigen, wie solch ein Prädikat aussehen muss. Hier ist der Quelltext des Prädikates</p>
<pre><code class="language-cpp">template&lt;typename A, typename B&gt;
struct equal {
        static const int value=is_same&lt;typename A::slot_id, B&gt;::value;
};
</code></pre>
<p>Eigentlich ja einfach, aber muss man erst einmal drauf kommen, warum es so geht und der/die anderen Weg nicht funktioniert haben. Ok die Erklärung:<br />
Es handelt sich also um eine Metafunktion und der entscheidende Punkt war die Definition des <em>value</em>. Ich hatte unter anderem auch versucht direkt von <em>is_same</em> zu erben, wodurch der <em>value</em> von <em>is_same</em> kommt. Aber: Bei der Instantiierung von <em>equal</em> wurde dann auch <em>is_same</em> direkt instantiiert und auf den eingekapselten Typ zugegriffen, der bei einem Placeholder nicht existiert. Wenn ich die Definition des <em>value</em> aber in <em>equal</em> reinschreibe, wird dieser Ausdruck erst ausgewertet, wenn auf <em>value</em> zugegriffen wird. Dies geschieht in einem Kontext, wo der Placeholder durch das aktuelle Element der Sequenz ersetzt wird. Dieser Typ hat den eingekapselten Type <em>slot_id</em> und diesen kann ich dann vergleichen.</p>
<p>Und hier der restliche Quelltext, um zu zeigen wie <em>equal</em> jetzt benutzt werden kann.</p>
<pre><code class="language-cpp">template&lt;int i&gt;
struct Slot {
    typedef Slot type;
    typedef int_&lt;i&gt; slot_id;
};
typedef vector&lt;Slot&lt;0&gt;, Slot&lt;10&gt;, Slot&lt;15&gt; &gt; slots;
typedef find_if&lt;slots, equal&lt; _1, int_&lt;10&gt; &gt; &gt;::type t10;

BOOST_MPL_ASSERT(( is_same&lt; deref&lt;t10&gt;::type, Slot&lt;10&gt; &gt; ));
</code></pre>
<p>Jetzt arbeitet alles so, wie es soll <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1955585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955585</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Tue, 21 Sep 2010 19:17:06 GMT</pubDate></item></channel></rss>