<?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[is_none_of]]></title><description><![CDATA[<p>Ahoi</p>
<p>hat jemand eine Idee für:</p>
<pre><code class="language-cpp">#define is_none_of(val, v1, v2, v3, v4, v5, v6, v7, v8, v9) \
  (val != v1 &amp;&amp; val != v2 &amp;&amp; val != v3 &amp;&amp; ...
</code></pre>
<p>Geht da vielleicht was rekursiv? Oder mit Templates? Also am besten wäre ein is_none_of mit variabler Parameterzahl, aber zumindest mit nur einer Ober und keiner Untergrenze.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290564/is_none_of</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 10:16:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290564.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Jul 2011 02:58:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 02:58:32 GMT]]></title><description><![CDATA[<p>Ahoi</p>
<p>hat jemand eine Idee für:</p>
<pre><code class="language-cpp">#define is_none_of(val, v1, v2, v3, v4, v5, v6, v7, v8, v9) \
  (val != v1 &amp;&amp; val != v2 &amp;&amp; val != v3 &amp;&amp; ...
</code></pre>
<p>Geht da vielleicht was rekursiv? Oder mit Templates? Also am besten wäre ein is_none_of mit variabler Parameterzahl, aber zumindest mit nur einer Ober und keiner Untergrenze.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099263</guid><dc:creator><![CDATA[hmja]]></dc:creator><pubDate>Fri, 29 Jul 2011 02:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 05:15:45 GMT]]></title><description><![CDATA[<p>Mit Boost.Preprocessor:</p>
<pre><code class="language-cpp">#include &lt;boost/preprocessor/seq.hpp&gt;

#define AND_IS_UNEQUAL(unused, data, elem) &amp;&amp; ((data) != (elem))
#define IS_NONE_OF(needle, sequence) true BOOST_PP_SEQ_FOR_EACH(AND_IS_UNEQUAL, needle, sequence)

int main() {
  /* IS_NONE_OF(0, (1)(2)(3)) expandiert zu true &amp;&amp; ((0) != (1)) &amp;&amp; ((0) != (2)) &amp;&amp; ((0) != (3) */
  if(IS_NONE_OF(0, (1)(2)(3))) {
    ...
  }
}
</code></pre>
<p>Mit variadischen Templates (C++11):</p>
<pre><code class="language-cpp">template&lt;typename T&gt; bool is_none_of(T const &amp;t) { return true; }
template&lt;typename T, typename A, typename... Args&gt; bool is_none_of(T const &amp;t, A const &amp;a1, Args... args) {
  return t != a1 &amp;&amp; is_none_of(t, args...);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099271</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 29 Jul 2011 05:15:45 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 09:11:30 GMT]]></title><description><![CDATA[<p>Etwas weniger spektakulär, ohne schwarze Magie, dafür eine relativ schöne Syntax:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;algorithm&gt;

class number
{
    private:
        struct holder
        {
            explicit holder(int x)
            : x(x)
            , ys()
            {
            }

            holder&amp; operator() (int y)
            {
                ys.push_back(y);
                return *this;
            }

            operator bool () const
            {
                return std::find(ys.begin(), ys.end(), x) == ys.end();
            }

            int              x;
            std::vector&lt;int&gt; ys;
        };

    public:
        explicit number(int x)
        : is_none_of(x)
        {
        }

        holder is_none_of;
};
</code></pre>
<p>Anwendung:</p>
<pre><code class="language-cpp">int main()
{
    bool a = number(7).is_none_of(4)(1)(3)(8);
    bool b = number(7).is_none_of(2)(1)(7);
}
</code></pre>
<p>Oder wenn dir das lieber ist, mit entsprechender Umbenennung:</p>
<pre><code class="language-cpp">int main()
{
    bool a = is(7).none_of(4)(1)(3)(8);
    bool b = is(7).none_of(2)(1)(7);
}
</code></pre>
<p>Falls dir andere Operatoren besser gefallen, kannst du z.B. auch <code>operator&lt;&lt;</code> oder <code>operator,</code> verwenden. Wenn du C++0x nutzen kannst, wären auch Initializer-Lists eine Möglichkeit. Und Variadic Templates sind natürlich ganz elegant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099325</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 29 Jul 2011 09:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 09:14:06 GMT]]></title><description><![CDATA[<p>mach den holder-Member private und is_none_of zu einer Funktion, die holder::op() aufruft und eine Referenz zurückgibt. Sonst geht sowas:</p>
<pre><code class="language-cpp">number n7(7);
n.is_none_of = number(8).is_none_of;
if(! n7.is_none_of(8, 9, 10))
  std::cout &lt;&lt; &quot;WTF???&quot;;
</code></pre>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/2099329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099329</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 29 Jul 2011 09:14:06 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 09:27:10 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>mach den holder-Member private und is_none_of zu einer Funktion, die holder::op() aufruft und eine Referenz zurückgibt</p>
</blockquote>
<p>Hatte ich zuerst, aber mir kam der Code sonst schon zu gross vor. Solange man nur temporäre Ausdrücke verwendet, ist ja auch alles ok. Aber du hast schon recht, es wäre sicherer <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>Übrigens, ich warte auf deinen Metaprogrammierungs-Ansatz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099333</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 29 Jul 2011 09:27:10 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 09:31:35 GMT]]></title><description><![CDATA[<p>Den Vektor sollte man loswerden. Denkbar etwa</p>
<pre><code class="language-cpp">class number
{
private:
  struct holder
  {
    explicit holder(int x)
      : x(x),
        b(true)
    {
    }

    holder&amp; operator() (int y)
    {
      b = b &amp;&amp; x != y;
      return *this;
    }

    operator bool () const
    {
      return b;
    }

    int  x;
    bool b;
  };

public:
  explicit number(int x)
    : is_none_of(x)
  {
  }

  holder is_none_of;
};
</code></pre>
<p>Einen echten Kurzschlussmechanismus kriegt man so wahrscheinlich nicht hin, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099336</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 29 Jul 2011 09:31:35 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 09:39:03 GMT]]></title><description><![CDATA[<p>So würds mit variadic templates gehen. <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename Value, typename Other&gt;
bool is_none_of(Value toCompare, Other value)
{
  return (toCompare != value);
}

template&lt;typename Value, typename Head, typename... Tail&gt;
bool is_none_of(Value toCompare, Head arg1, Tail... args)
{
  return (toCompare != arg1) &amp;&amp; is_none_of(toCompare, args...);
}

int main()
{
        int value = 123;

        std::cout &lt;&lt; is_none_of(value, 1, 2, 3, 4, 5, 6, 7) &lt;&lt; &quot;\n&quot;;
        std::cout &lt;&lt; is_none_of(value, 120, 121, 122, 123) &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Edit: Zu spät ... Die Lösung oben war auf so wenig Zeilen gequetscht, hab ich glatt überlesen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099338</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 29 Jul 2011 09:39:03 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 09:40:30 GMT]]></title><description><![CDATA[<p>seldon, sehr schön! Da hätte ich eigentlich auch drauf kommen können...</p>
<p>Was meinst du mit &quot;echtem Kurzschluss&quot;? Der <code>operator&amp;&amp;</code> wertet ja den rechten Operanden nicht mehr aus, falls der linke <code>false</code> ist. Aber die Funktionsaufrufe wirst du nicht verhindern können, da sie bei der Anwendung im Quelltext stehen. Je nach Optimierung dürfte der Overhead aber gering sein.</p>
<p>Die Frage ist, ob die Liste der Werte <code>y</code> zur Kompilierzeit bekannt ist. Unter Umständen könnte man dann da noch ein wenig Geschwindigkeit herausholen. Allerdings wird es kaum deine anfänglichen Vorschläge übertreffen, wo der Ausdruck 1:1 da steht <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099339</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 29 Jul 2011 09:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 09:48:33 GMT]]></title><description><![CDATA[<p>Naja, wenn ich</p>
<pre><code class="language-cpp">number(7).is_none_of(7)(1)(1)(1)(1)(1);
</code></pre>
<p>schreibe, wird einmal b, dann 7 != 7, und dann 5 mal b geprüft. Mit &quot;Kurzschlussmechanismus&quot; meine ich, dass man sich die letzten fünf Prüfungen spart.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099340</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 29 Jul 2011 09:48:33 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 10:41:47 GMT]]></title><description><![CDATA[<p>Variante von seldons/Nexus', ohne die Klassenschachtelung:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
template&lt;class T&gt;
struct test_t
{
  T const&amp; t_;
  bool matched;

  test_t(T const&amp; t) : t_(t), matched(false) {}

  template &lt;class U&gt;
  test_t&amp; operator,(U const&amp; u)
  {
    matched = matched &amp;&amp; t_ == u;
    return *this;
  }
};

template &lt;class T&gt;
test_t&lt;T&gt; test(T const&amp; t)
{
  return test_t&lt;T&gt;(t);
}

template &lt;class T&gt;
bool is_none_of(test_t&lt;T&gt; const&amp; tt)
{
  return !tt.matched;
}

int main()
{
  std::cout &lt;&lt; is_none_of((test(15), 14u, 12l, 3.6)) &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099342</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 29 Jul 2011 10:41:47 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 12:38:11 GMT]]></title><description><![CDATA[<p>Ist es eigentlich möglich, ein Funktions-Argumentpack bequem auzusplitten? Ich hatte an so etwas gedacht (Idee: <s>geringere Rekursionstiefe</s> weniger rekursive Instantiierung führt dazu, dass der Compiler das Inlining nicht zu früh aufgibt)</p>
<pre><code class="language-cpp">#include &lt;tuple&gt;

template &lt;typename Tuple&gt;
struct tuple_split;

template &lt;std::size_t N, typename Tuple&gt;
struct tuple_ignore_first;

template &lt;std::size_t N, typename T0, typename... Args&gt;
struct tuple_ignore_first&lt;N, std::tuple&lt;T0, Args...&gt;&gt; : tuple_ignore_first&lt;N-1, std::tuple&lt;Args...&gt;&gt;::type
{};

template &lt;typename... Args&gt;
struct tuple_ignore_first&lt;0, std::tuple&lt;Args...&gt;&gt;
{
    typedef std::tuple&lt;Args...&gt; type;
    template &lt;typename T, typename... ExtraArgs&gt;
    void is_not_of(T&amp;&amp; value, ExtraArgs&amp;..., Args&amp;&amp;... args)
    {
        return tuple_split&lt;Args...&gt;::first::is_not_of(std::forward(value), std::forward(args)...)
            &amp;&amp; tuple_split&lt;Args...&gt;::last::is_not_of(std::forward(value), std::forward(args)...);
    };
};

template &lt;typename Arg&gt;
struct tuple_ignore_first&lt;0, std::tuple&lt;Arg&gt;&gt;
{
    typedef std::tuple&lt;Arg&gt; type;
    template &lt;typename T, typename... ExtraArgs&gt;
    void is_not_of(T&amp;&amp; value, ExtraArgs&amp;..., Arg&amp;&amp; arg)
    {
        return value != arg;
    };
};

template &lt;&gt;
struct tuple_ignore_first&lt;0, std::tuple&lt;&gt;&gt;
{
    typedef std::tuple&lt;Args...&gt; type;
    template &lt;typename T, typename... ExtraArgs&gt;
    void is_not_of(T&amp;&amp; value, ExtraArgs&amp;...)
    {
        return true;
    };
};

template &lt;std::size_t N, typename Tuple&gt;
struct tuple_ignore_last;

template &lt;std::size_t N, typename... Args, typename TN&gt;
struct tuple_ignore_last&lt;N, std::tuple&lt;Args..., TN&gt;&gt; : tuple_ignore_last&lt;N-1, std::tuple&lt;Args...&gt;&gt;::type
{};

template &lt;typename... Args&gt;
struct tuple_ignore_last&lt;0, std::tuple&lt;Args...&gt;&gt;
{
    typedef std::tuple&lt;Args...&gt; type;
    template &lt;typename T, typename... ExtraArgs&gt;
    void is_not_of(T&amp;&amp; value, Args&amp;&amp;... args, ExtraArgs&amp;&amp;...)
    {
        return tuple_split&lt;Args...&gt;::first::is_not_of(std::forward(value), std::forward(args)...)
            &amp;&amp; tuple_split&lt;Args...&gt;::last::is_not_of(std::forward(value), std::forward(args)...);
    };
};

template &lt;typename Arg&gt;
struct tuple_ignore_last&lt;0, std::tuple&lt;Arg&gt;&gt;
{
    typedef std::tuple&lt;Arg&gt; type;
    template &lt;typename T, typename... ExtraArgs&gt;
    void is_not_of(T&amp;&amp; value, Arg&amp;&amp; arg, ExtraArgs&amp;...)
    {
        return value != arg;
    };
};

template &lt;&gt;
struct tuple_ignore_first&lt;0, std::tuple&lt;&gt;&gt;
{
    typedef std::tuple&lt;Args...&gt; type;
    template &lt;typename T, typename... ExtraArgs&gt;
    void is_not_of(T&amp;&amp; value, ExtraArgs&amp;...)
    {
        return true;
    };
};

template &lt;typename Tuple&gt;
struct tuple_split
{
    typedef tuple_ignore_last&lt;(std::tuple_size&lt;Tuple&gt;::value+1)/2, Tuple&gt; first;
    typedef tuple_ignore_first&lt;std::tuple_size&lt;Tuple&gt;::value/2, Tuple&gt; last;
};

template &lt;typename T, typename T&amp;&amp; Args&gt;
void is_not_of(T&amp;&amp; value, Args&amp;&amp;... args)
{
    return tuple_split&lt;Args...&gt;::first::is_not_of(std::forward(value), std::forward(args)...)
        &amp;&amp; tuple_split&lt;Args...&gt;::last::is_not_of(std::forward(value), std::forward(args)...);
};
</code></pre>
<p>So geht das ntürlich nicht. Falls es nicht auf die Reihenfolge des Vergleichs ankommt, gäbe es eine einfache Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099421</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 29 Jul 2011 12:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 12:46:15 GMT]]></title><description><![CDATA[<p>Was mir nur so aufgefallen ist: Deine falsche Verwendung von std::forward.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099426</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 29 Jul 2011 12:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 12:52:32 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Was mir nur so aufgefallen ist: Deine falsche Verwendung von std::forward.</p>
</blockquote>
<p>std::forward&lt;Args&gt;(args)... natürlich. Das ist auch nicht der einzige Syntaxfehler der verbleibt - aber nicht das Problem, um das es mir geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099427</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 29 Jul 2011 12:52:32 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 13:02:11 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Idee: <s>geringere Rekursionstiefe</s> weniger rekursive Instantiierung führt dazu, dass der Compiler das Inlining nicht zu früh aufgibt)</p>
</blockquote>
<p>Blöde Frage, aber reicht dazu nicht ganz normales loop unrolling?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099436</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 29 Jul 2011 13:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 13:06:38 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Idee: <s>geringere Rekursionstiefe</s> weniger rekursive Instantiierung führt dazu, dass der Compiler das Inlining nicht zu früh aufgibt)</p>
</blockquote>
<p>Blöde Frage, aber reicht dazu nicht ganz normales loop unrolling?</p>
</blockquote>
<p>Braucht man dafür nicht eine Schleife?<br />
Ich kann mich erinnern, dass frühere vc-Versionen (05 war es glaube ich), inlining grundsätzlich aufgeben wenn die Rekursionstiefe 16 überschreitet; möglich dass das jetzt nicht mehr der Fall ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099440</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 29 Jul 2011 13:06:38 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 13:19:52 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Idee: <s>geringere Rekursionstiefe</s> weniger rekursive Instantiierung führt dazu, dass der Compiler das Inlining nicht zu früh aufgibt)</p>
</blockquote>
<p>Blöde Frage, aber reicht dazu nicht ganz normales loop unrolling?</p>
</blockquote>
<p>Braucht man dafür nicht eine Schleife?</p>
</blockquote>
<p>Ich habe sowas aber mal für ein type-array gebaut wo das count() zu teuer war.</p>
<p>Die Idee war einfach, statt nur Head und Tails zu nehmen, 10 Heads zu nehmen und einen Tail und das ganze zu überladen. So dass es eine Version mit 1 Item, 5 Items und 10 Items gab.</p>
<p>Und anstatt dann bei 102 Items eine rekursionstiefe von 102 zu haben, hatte man nur 12 (10mal 10 Items lesen und 2 mal 1 Item lesen).</p>
<p>Müsste hier doch auch funktionieren, oder?</p>
<p>Mein Problem ist, dass mein Compiler keine variadic Templates kann - deshalb kann ich die Syntax noch nicht und kann deshalb kein Beispiel zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099458</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 29 Jul 2011 13:19:52 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 13:24:05 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Idee: <s>geringere Rekursionstiefe</s> weniger rekursive Instantiierung führt dazu, dass der Compiler das Inlining nicht zu früh aufgibt)</p>
</blockquote>
<p>Blöde Frage, aber reicht dazu nicht ganz normales loop unrolling?</p>
</blockquote>
<p>Braucht man dafür nicht eine Schleife?</p>
</blockquote>
<p>Ich habe sowas aber mal für ein type-array gebaut wo das count() zu teuer war.</p>
<p>Die Idee war einfach, statt nur Head und Tails zu nehmen, 10 Heads zu nehmen und einen Tail und das ganze zu überladen. So dass es eine Version mit 1 Item, 5 Items und 10 Items gab.</p>
<p>Und anstatt dann bei 102 Items eine rekursionstiefe von 102 zu haben, hatte man nur 12 (10mal 10 Items lesen und 2 mal 1 Item lesen).</p>
<p>Müsste hier doch auch funktionieren, oder?</p>
<p>Mein Problem ist, dass mein Compiler keine variadic Templates kann - deshalb kann ich die Syntax noch nicht und kann deshalb kein Beispiel zeigen.</p>
</blockquote>
<p>Das wäre gewissermaßen brute-force - ein möglicher Ausweg. Nur scheint mir dass das eigentlich gerade das war, was man durch variadic Templates beseitigen wollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099463</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 29 Jul 2011 13:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 13:33:01 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Nur scheint mir dass das eigentlich gerade das war, was man durch variadic Templates beseitigen wollte.</p>
</blockquote>
<p>Wieso? Du implementiert die Funktion natürlich 5 mal, mit unterschiedlich vielen Parametern. zB 1, 10, 20, 50, 100 - dafür hast du eine enorme Geschwindigkeit, weil deine Rekursionstiefe (auch beim Kompilieren des Templates) enorm klein ist. zB eine Rekursion für 432 Elemente wäre nur noch 8 Ebenen Tief.</p>
<p>Klar gewinnt das keinen optischen Schönheitsbeweis - aber Loop Unrolling ist halt etwas messy <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="😉"
    /> Wie gesagt, wir hatten einmal das Problem mit so einem Type-Array und der Funktion count() dazu die die Anzahl der Elemente des Arrays liefern sollte. Ab einer gewissen Tiefe ist der Compiler ausgestiegen und hat es nicht mehr kompiliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099471</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 29 Jul 2011 13:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to is_none_of on Fri, 29 Jul 2011 13:38:02 GMT]]></title><description><![CDATA[<p>Ich hab keinen C++0x-Compiler, aber sollte nicht etwas in der folgenden Art gehen?</p>
<pre><code class="language-cpp">bool is_none_of(int x, initializer_list&lt;int&gt; sequence)
{
    return find(sequence.begin(), sequence.end(), x) == sequence.end();
}

is_none_of(5, {6, 7, 2});
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099475</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 29 Jul 2011 13:38:02 GMT</pubDate></item></channel></rss>