<?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[Variadische Template-Argumente verodern.]]></title><description><![CDATA[<p>Hoi,<br />
ich möchte eine Liste an variadischen Templateargumenten möglichst elegant per || verknüpfen, mit den üblichen C++-Semantiken (Abbruch der Evaluierung sobald 1 Wert wahr etc).</p>
<p>Das wäre nicht allzuschwer hinzuhacken, aber dafür gibt es doch auch syntaktisch elegante Wege?</p>
<p>So funktioniert es ja leider nicht, hatte im Kopf dass es in anderem Kontext so ähnlich geht:</p>
<pre><code class="language-cpp">template&lt;class First, class... Rest&gt;
struct Or
{
	template&lt;typename IteratorType&gt;
	static bool match(IteratorType begin, IteratorType end,
		IteratorType&amp; newBegin)
	{
		bool matched = (First::match(begin, end, newBegin) ||
			Rest::match(begin, end, newBegin))...;
		return matched;
	}
};
</code></pre>
<p>Danke und Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308641/variadische-template-argumente-verodern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 17:29:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308641.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Oct 2012 07:48:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 07:48:32 GMT]]></title><description><![CDATA[<p>Hoi,<br />
ich möchte eine Liste an variadischen Templateargumenten möglichst elegant per || verknüpfen, mit den üblichen C++-Semantiken (Abbruch der Evaluierung sobald 1 Wert wahr etc).</p>
<p>Das wäre nicht allzuschwer hinzuhacken, aber dafür gibt es doch auch syntaktisch elegante Wege?</p>
<p>So funktioniert es ja leider nicht, hatte im Kopf dass es in anderem Kontext so ähnlich geht:</p>
<pre><code class="language-cpp">template&lt;class First, class... Rest&gt;
struct Or
{
	template&lt;typename IteratorType&gt;
	static bool match(IteratorType begin, IteratorType end,
		IteratorType&amp; newBegin)
	{
		bool matched = (First::match(begin, end, newBegin) ||
			Rest::match(begin, end, newBegin))...;
		return matched;
	}
};
</code></pre>
<p>Danke und Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255973</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 01 Oct 2012 07:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 07:54:07 GMT]]></title><description><![CDATA[<p>Was soll das Ergebnis einer Oder-Verknuepfung von Typen sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255977</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 01 Oct 2012 07:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 07:58:03 GMT]]></title><description><![CDATA[<p>Jeder der Typen implementiert eine statische match-Funktion, die ein bool zurückgibt. Sieht man doch im Snippet. <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/2255980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255980</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 01 Oct 2012 07:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 08:21:17 GMT]]></title><description><![CDATA[<p><strong>variadisch</strong> - LMAO. <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>
<p>Meinst du sowas:</p>
<pre><code class="language-cpp">template&lt;typename IterT,
         typename First&gt;
bool Or(IterT begin,
        IterT end,
        IterT&amp; newBegin)
{
        return First::match(begin, end, newBegin);
}

template&lt;typename IterT,
         typename First,
         typename Second,
         typename ... Rest&gt;
bool Or(IterT begin,
        IterT end,
        IterT&amp; newBegin)
{
        if(First::match(begin, end, newBegin) or Second::match(begin, end, newBegin))
                return true;

        return   First::match(begin, end, newBegin)
              or Or&lt;IterT, Second, Rest...&gt;(begin, end, newBegin);
}
</code></pre>
<p>?<br />
Das wäre mein rekursiver Ansatz. Ich kann aber nichts testen, da ich keine Beispiel Typen habe und auch keine Lust habe, sie zu basteln.</p>
<p>Edit: Jetzt funktionierts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255983</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 01 Oct 2012 08:21:17 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 08:18:21 GMT]]></title><description><![CDATA[<blockquote>
<p>variadisch</p>
</blockquote>
<p>Korrekte Übersetzung, Du Kichererbse. <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/2255985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255985</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 01 Oct 2012 08:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 08:22:21 GMT]]></title><description><![CDATA[<p>Sowas?</p>
<pre><code class="language-cpp">template&lt;class First, class... Rest&gt;
struct Or
{
	template&lt;typename IteratorType&gt;
	static bool match(IteratorType begin, IteratorType end,
		IteratorType&amp; newBegin)
	{
		bool matched = (First::match(begin, end, newBegin) ||
			Or&lt;Rest...&gt;::match(begin, end, newBegin));
		return matched;
	}
};

template&lt;class First&gt;
struct Or
{
	template&lt;typename IteratorType&gt;
	static bool match(IteratorType begin, IteratorType end,
		IteratorType&amp; newBegin)
	{
		bool matched = (First::match(begin, end, newBegin);
		return matched;
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2255986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255986</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Oct 2012 08:22:21 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 08:27:01 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<blockquote>
<p>variadisch</p>
</blockquote>
<p>Korrekte Übersetzung, Du Kichererbse. <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>
</blockquote>
<p>Aha, aber<br />
<a href="http://dict.leo.org/ende?lp=ende&amp;lang=de&amp;searchLoc=0&amp;cmpType=relaxed&amp;sectHdr=on&amp;spellToler=&amp;search=variadic" rel="nofollow">http://dict.leo.org/ende?lp=ende&amp;lang=de&amp;searchLoc=0&amp;cmpType=relaxed&amp;sectHdr=on&amp;spellToler=&amp;search=variadic</a><br />
<a href="http://de.pons.eu/dict/search/results/?q=variadic&amp;l=deen&amp;ie=%E2%98%A0" rel="nofollow">http://de.pons.eu/dict/search/results/?q=variadic&amp;l=deen&amp;ie=<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/2620.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--skull_and_crossbones"
      title=":skull_and_crossbones:"
      alt="☠"
    /></a></p>
<p>Sagen beide, den Begriff <em>variadic</em> gibts nicht...</p>
<p>Sogar Google erkennt bei variadic die Sprache Spanisch:<br />
<a href="http://translate.google.de/?hl=de&amp;tab=wT#auto/de/variadic" rel="nofollow">http://translate.google.de/?hl=de&amp;tab=wT#auto/de/variadic</a></p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Sowas?</p>
<pre><code class="language-cpp">template&lt;class First, class... Rest&gt;
struct Or
{
	template&lt;typename IteratorType&gt;
	static bool match(IteratorType begin, IteratorType end,
		IteratorType&amp; newBegin)
	{
		bool matched = (First::match(begin, end, newBegin) ||
			Or&lt;Rest...&gt;::match(begin, end, newBegin));
		return matched;
	}
};

template&lt;class First&gt;
struct Or
{
	template&lt;typename IteratorType&gt;
	static bool match(IteratorType begin, IteratorType end,
		IteratorType&amp; newBegin)
	{
		bool matched = (First::match(begin, end, newBegin);
		return matched;
	}
};
</code></pre>
</blockquote>
<p>Du redefinierst hier <code>Or</code> , oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255987</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 01 Oct 2012 08:27:01 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 08:35:15 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p><a href="http://dict.leo.org/ende?lp=ende&amp;lang=de&amp;searchLoc=0&amp;cmpType=relaxed&amp;sectHdr=on&amp;spellToler=&amp;search=variadic" rel="nofollow">http://dict.leo.org/ende?lp=ende&amp;lang=de&amp;searchLoc=0&amp;cmpType=relaxed&amp;sectHdr=on&amp;spellToler=&amp;search=variadic</a><br />
<a href="http://de.pons.eu/dict/search/results/?q=variadic&amp;l=deen&amp;ie=%E2%98%A0" rel="nofollow">http://de.pons.eu/dict/search/results/?q=variadic&amp;l=deen&amp;ie=<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/2620.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--skull_and_crossbones"
      title=":skull_and_crossbones:"
      alt="☠"
    /></a></p>
<p>Sagen beide, den Begriff <em>variadic</em> gibts nicht...</p>
<p>Sogar Google erkennt bei variadic die Sprache Spanisch:<br />
<a href="http://translate.google.de/?hl=de&amp;tab=wT#auto/de/variadic" rel="nofollow">http://translate.google.de/?hl=de&amp;tab=wT#auto/de/variadic</a></p>
</blockquote>
<p>Und weil zwei von vielen Übersetzungsseiten das <em>nicht</em> kennen, bedeutet das, dass es auch keine Übersetzung gibt? Oder dass es garnicht existiert, oder wie? Und Google Übersetzer ist natürlich das Maß der Dinge <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p><a href="http://dict.cc" rel="nofollow">dict.cc</a> kennts: <a href="http://www.dict.cc/?s=variadic" rel="nofollow">http://www.dict.cc/?s=variadic</a></p>
<p>Sone schrieb:</p>
<blockquote>
<p>Du redefinierst hier <code>Or</code> , oder?</p>
</blockquote>
<p>Ja, war syntaktisch nicht ganz korrekt...</p>
<pre><code class="language-cpp">template &lt;class...&gt; struct Or;

template&lt;class First, class... Rest&gt;
struct Or&lt;First, Rest...&gt;
{
    template&lt;typename IteratorType&gt;
    static bool match(IteratorType begin, IteratorType end,
        IteratorType&amp; newBegin)
    {
        bool matched = (First::match(begin, end, newBegin) ||
            Or&lt;Rest...&gt;::match(begin, end, newBegin));
        return matched;
    }
};

template &lt;class Last&gt;
struct Or&lt;Last&gt;
{
   template &lt;class I&gt;
   static bool match(I begin, I end, I&amp; newBegin)
   { return Last::match(begin, end, newBegin); }
};

struct T { bool match(char*, char*, char*&amp;) {return true;} }
struct F { bool match(char*, char*, char*&amp;) {return false;} }

#include &lt;iostream&gt;
int main()
{ 
  char[] hw = &quot;Hello, World!&quot;;
  char* const e = hw + sizeof(hw);
  char* ptr = nullptr;

  typedef Or&lt;T,T,F&gt; OF1;
  cout &lt;&lt; OF1::match(hw, e, ptr) &lt;&lt; '\n';

  typedef Or&lt;T,T,T&gt; OT1;
  cout &lt;&lt; OT1::match(hw,e,ptr) &lt;&lt; '\n';

  typedef Or&lt;T,T,OT1&gt; OT2;
  cout &lt;&lt; OT2::match(hw,e,ptr) &lt;&lt; '\n';
}
</code></pre>
<p>Kannn ich auf ideone leider grade nicht testen, da hat der GCC und das Syntax-Highlighting gerade die Grätsche gemacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255991</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Oct 2012 08:35:15 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 08:56:00 GMT]]></title><description><![CDATA[<p>Ja, das ist schon in Ordnung so, dake. <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="😉"
    /><br />
Hatte nur eben die Hoffnung, dass es da irgendwo syntaktischen Zucker gäbe, um nicht immer Rekursion implementieren zu müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2255996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2255996</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 01 Oct 2012 08:56:00 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:30:07 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Ja, das ist schon in Ordnung so, dake. <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="😉"
    /><br />
Hatte nur eben die Hoffnung, dass es da irgendwo syntaktischen Zucker gäbe, um nicht immer Rekursion implementieren zu müssen.</p>
</blockquote>
<pre><code class="language-cpp">template&lt;typename IterT,
         typename First,
         typename Second,
         typename ... Rest&gt;
bool Or(IterT begin,
        IterT end,
        IterT&amp; newBegin)
{
        std::initializer_list&lt;bool&gt; list = {First::match(begin, end, newBegin), Second::match(begin, end, newBegin), Rest::match(begin, end, newBegin)...};
        return std::count(list.begin(), list.end(), true);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2256000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256000</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:30:07 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:21:48 GMT]]></title><description><![CDATA[<p>Sorry Hacker. <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>
<blockquote>
<p>mit den üblichen C++-Semantiken (<strong>Abbruch der Evaluierung sobald 1 Wert wahr etc</strong>).</p>
</blockquote>
<p>So ähnlich ist es mir zunächst auch in den Sinn gekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256003</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:21:48 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:28:22 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Sorry Hacker. <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>
<blockquote>
<p>mit den üblichen C++-Semantiken (<strong>Abbruch der Evaluierung sobald 1 Wert wahr etc</strong>).</p>
</blockquote>
<p>So ähnlich ist es mir zunächst auch in den Sinn gekommen.</p>
</blockquote>
<p>Stopp! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /><br />
<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="➡"
    /> Eigenes <code>count</code> !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256004</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:28:22 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:27:46 GMT]]></title><description><![CDATA[<p>Also sowas, wie wäre es damit?</p>
<pre><code class="language-cpp">bool one_of(std::initializer_list&lt;bool&gt; const&amp; b)
{
        for(auto const val : b)
                if(val)
                        return true;

        return false;
}

template&lt;typename IterT,
         typename First,
         typename Second,
         typename ... Rest&gt;
bool Or(IterT begin,
        IterT end,
        IterT&amp; newBegin)
{
        return one_of({First::match(begin, end, newBegin), Second::match(begin, end, newBegin), Rest::match(begin, end, newBegin)...});
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2256005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256005</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:35:03 GMT]]></title><description><![CDATA[<p>Das verhindert aber nicht, dass du sämtliche Bedingungen evaluierst, sondern nur, dass du dir alle Ergebnisse anguckst.<br />
Und das gibt es (seit C++11) schon und heißt <code>std::any_of</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256007</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:35:03 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:39:48 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Das verhindert aber nicht, dass du sämtliche Bedingungen evaluierst, sondern nur, dass du dir alle Ergebnisse anguckst.<br />
Und das gibt es (seit C++11) schon und heißt <code>std::any_of</code> .</p>
</blockquote>
<p>Tja, hab ich beides schon geahnt... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Tja, neh, dann geht nur die rekursive Variante, hast Recht Ethon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256008</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:44:31 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Eisflamme schrieb:</p>
<blockquote>
<blockquote>
<p>variadisch</p>
</blockquote>
<p>Korrekte Übersetzung, Du Kichererbse. <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>
</blockquote>
<p>Aha, aber</p>
</blockquote>
<p>Du zitierst Wörterbücher, die nicht Mal den englischen Begriff kennen, und lachst dann über die Übersetzung?</p>
<p><a href="http://www.dict.cc/?s=variadic" rel="nofollow">http://www.dict.cc/?s=variadic</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256010</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:44:31 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:50:08 GMT]]></title><description><![CDATA[<p>edit: zu spät...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256012</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:50:08 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 09:55:11 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Eisflamme schrieb:</p>
<blockquote>
<blockquote>
<p>variadisch</p>
</blockquote>
<p>Korrekte Übersetzung, Du Kichererbse. <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>
</blockquote>
<p>Aha, aber</p>
</blockquote>
<p>Du zitierst Wörterbücher, die nicht Mal den englischen Begriff kennen, und lachst dann über die Übersetzung?</p>
<p><a href="http://www.dict.cc/?s=variadic" rel="nofollow">http://www.dict.cc/?s=variadic</a></p>
</blockquote>
<p>Nein, eigentlich wollte ich damit andeuten dass das alles eine sinnlose Diskussion wird, weil es den begriff variadic gar nicht gibt... anscheinend gibt es ihn doch...</p>
<p>Wie auch immer: <em>variadisch</em> fand' ich einfach nur lustig, nicht falsch o. ä.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256019</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 01 Oct 2012 09:55:11 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 10:08:55 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Nein, eigentlich wollte ich damit andeuten dass das alles eine sinnlose Diskussion wird, weil es den begriff variadic gar nicht gibt...</p>
</blockquote>
<p>Selbst wenn er in keiner Übersetzungsseite aufgetaucht wäre, ist er im Standard fest definiert, jeder hier weiß, was gemeint ist (auch mit der deutschen Übersetzung), und das einzig sinnlose ist, dass du ne Diskussion darüber vom Zaun gebrochen hast <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>
<p>PS, wozu oben überhaupt initializer_list?</p>
<pre><code class="language-cpp">template &lt;unsigned N&gt;
constexpr bool any_of(const bool* arr)
{
  return (N == 0) ? false : 
           ((N==1) ? (*arr): (any_of&lt;N/2&gt;(arr) || any_of&lt;N-N/2&gt;(arr+N/2)));
}

template&lt;class... Rest&gt;
struct Or
{
    template&lt;typename IteratorType&gt;
    static bool match(IteratorType begin, IteratorType end,
        IteratorType&amp; newBegin)
    {
        const bool matched[] = {Rest::match(begin, end, newBegin)...};
        return any_of&lt;sizeof...(Rest)&gt;(matched);
    }
};

struct T { static constexpr bool match(char*, char*, char*&amp;) {return true;} };
struct F { static bool match(char*, char*, char*&amp;) {return false;} };

#include &lt;iostream&gt;
using namespace std;
int main()
{ 
  char hw[] = &quot;Hello, World!&quot;;
  char* const e = hw + sizeof(hw);
  char* ptr = 0;

  typedef Or&lt;F,F,T&gt; OT1;
  cout &lt;&lt; OT1::match(hw, e, ptr) &lt;&lt; '\n';

  typedef Or&lt;F,F,F&gt; OF1;
  cout &lt;&lt; OF1::match(hw,e,ptr) &lt;&lt; '\n';

  typedef Or&lt;F,F,OF1&gt; OF2;
  cout &lt;&lt; OF2::match(hw,e,ptr) &lt;&lt; '\n';

  cout &lt;&lt; Or&lt;&gt;::match(hw,e,ptr) &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2256027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256027</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Oct 2012 10:08:55 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 13:24:03 GMT]]></title><description><![CDATA[<p>Hier eine nicht-rekursive Variante</p>
<pre><code class="language-cpp">template&lt;class... Rest&gt;
struct Or
{
    template&lt;typename IteratorType&gt;
    static bool match(IteratorType begin, IteratorType end,
        IteratorType&amp; newBegin)
    {
        bool result = false;
        const bool matched[] = { result = result || Rest::match(begin, end, newBegin)...};
        return (void)matched, result;
    }
};

struct T { static constexpr bool match(char*, char*, char*&amp;) {return true;} };
struct F { static bool match(char*, char*, char*&amp;) {return false;} };

#include &lt;iostream&gt;
using namespace std;
int main()
{
  char hw[] = &quot;Hello, World!&quot;;
  char* const e = hw + sizeof(hw);
  char* ptr = 0;

  typedef Or&lt;F,F,T&gt; OT1;
  cout &lt;&lt; OT1::match(hw, e, ptr) &lt;&lt; '\n';

  typedef Or&lt;F,F,F&gt; OF1;
  cout &lt;&lt; OF1::match(hw,e,ptr) &lt;&lt; '\n';

  typedef Or&lt;F,F,OF1&gt; OF2;
  cout &lt;&lt; OF2::match(hw,e,ptr) &lt;&lt; '\n';

  cout &lt;&lt; Or&lt;&gt;::match(hw,e,ptr) &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2256084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256084</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 01 Oct 2012 13:24:03 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 13:49:13 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Hier eine nicht-rekursive Variante</p>
<pre><code class="language-cpp">template&lt;class... Rest&gt;
struct Or
{
    template&lt;typename IteratorType&gt;
    static bool match(IteratorType begin, IteratorType end,
        IteratorType&amp; newBegin)
    {
        bool result = false;
        const bool matched[] = { result = result || Rest::match(begin, end, newBegin)...};
        return (void)matched, result;
    }
};
</code></pre>
</blockquote>
<p>Uh. Wie funktioniert das? Die pack expansion erstreckt sich &quot;einfach so&quot; auf den kompletten Ausdruck inklusive Veroderung? Oder fehlen da noch Klammern?</p>
<pre><code class="language-cpp">{ (result = result || Rest::match(begin, end, newBegin))...}
</code></pre>
<p>Und wozu beim return nochmal matched anführen? - damit irgendwas instantiiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256099</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Oct 2012 13:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 15:18:29 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Hier eine nicht-rekursive Variante</p>
<pre><code class="language-cpp">template&lt;class... Rest&gt;
struct Or
{
    template&lt;typename IteratorType&gt;
    static bool match(IteratorType begin, IteratorType end,
        IteratorType&amp; newBegin)
    {
        bool result = false;
        const bool matched[] = { result = result || Rest::match(begin, end, newBegin)...};
        return (void)matched, result;
    }
};
</code></pre>
</blockquote>
<p>Uh. Wie funktioniert das? Die pack expansion erstreckt sich &quot;einfach so&quot; auf den kompletten Ausdruck inklusive Veroderung? Oder fehlen da noch Klammern?</p>
</blockquote>
<p>Klammern wären fürs Lesen besser, habe ich nur versehentlich vergessen. Erforderlich sind sie allerdings nicht.<br />
Es gibt keine Packexpansion für Ausdrücke per se (wenn es sie gäbe, bräuchten wir das Array ja nicht). Die relevante Expansion hier ist</p>
<p>n3337 schrieb:</p>
<blockquote>
<p>initializer-list:<br />
initializer-clause ...opt<br />
initializer-list , initializer-clause ...opt</p>
</blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<pre><code class="language-cpp">{ (result = result || Rest::match(begin, end, newBegin))...}
</code></pre>
<p>Und wozu beim return nochmal matched anführen? - damit irgendwas instantiiert wird?</p>
</blockquote>
<p>Nur um eine Warnung wegen nicht verwendeter lokaler Variablen loszuwerden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256134</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 01 Oct 2012 15:18:29 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 15:55:23 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Es gibt keine Packexpansion für Ausdrücke per se (wenn es sie gäbe, bräuchten wir das Array ja nicht). Die relevante Expansion hier ist</p>
<p>n3337 schrieb:</p>
<blockquote>
<p>initializer-list:<br />
initializer-clause ...opt<br />
initializer-list , initializer-clause ...opt</p>
</blockquote>
</blockquote>
<p>Alles klar, note to myself: pack expansion nochmal genauer ansehen <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/2256154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256154</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Oct 2012 15:55:23 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 17:11:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@Camper</a>: Aber ruft der Ausdruck dann nicht match() für alle Template-Argumente auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256181</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 01 Oct 2012 17:11:28 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Mon, 01 Oct 2012 18:19:38 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@Camper</a>: Aber ruft der Ausdruck dann nicht match() für alle Template-Argumente auf?</p>
</blockquote>
<p>Sofern match fehlschlägt, sicher?<br />
pumuckls Version hat das Problem, das keine Kurzschlussauswertung erfolgt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2256210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256210</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 01 Oct 2012 18:19:38 GMT</pubDate></item><item><title><![CDATA[Reply to Variadische Template-Argumente verodern. on Tue, 02 Oct 2012 06:09:04 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@Camper</a>: Aber ruft der Ausdruck dann nicht match() für alle Template-Argumente auf?</p>
</blockquote>
<p>Ich hab mich auch gefragt, was da pssiert, und es wie folgt getestet:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

template&lt;class... Rest&gt;
struct Or
{
    template&lt;typename IteratorType&gt;
    static bool match(IteratorType begin, IteratorType end,
        IteratorType&amp; newBegin)
    {
        bool result = false;
        cout &lt;&lt; &quot;or::match - &quot;;
        const bool matched[] = { result = result || Rest::match(begin, end, newBegin)...};
        return (void)matched, result;
    }
};

struct T { static bool match(char*, char*, char*&amp;) {cout &lt;&lt; &quot;T::match - &quot;;
return true;} };
struct F { static bool match(char*, char*, char*&amp;) {cout &lt;&lt; &quot;F::match - &quot;;
return false;} };

int main()
{
  char hw[] = &quot;Hello, World!&quot;;
  char* const e = hw + sizeof(hw);
  char* ptr = 0;

  typedef Or&lt;F,F,T&gt; OT1;
  cout &lt;&lt; OT1::match(hw, e, ptr) &lt;&lt; '\n';

  typedef Or&lt;F,T,F&gt; OT2;
  cout &lt;&lt; OT2::match(hw,e,ptr) &lt;&lt; '\n';

  typedef Or&lt;T,F,OT1&gt; OT3;
  cout &lt;&lt; OT3::match(hw,e,ptr) &lt;&lt; '\n';
}
</code></pre>
<p>Output:</p>
<pre><code>or::match - F::match - F::match - T::match - 1
or::match - F::match - T::match - 1
or::match - T::match - 1
</code></pre>
<p>Heißt, die späteren matches werden nicht mehr aufgerufen.<br />
Was da nach packexpansion quasi steht ist ja auch folgendes (bei Or&lt;F,T,F&gt;)</p>
<pre><code class="language-cpp">const bool matched[] = 
{ result = result || F::match(begin, end, newBegin),
  result = result || T::match(begin, end, newBegin),
  result = result || F::match(begin, end, newBegin)};
</code></pre>
<p>Nach Auswertung einzelner matches heißt das eben</p>
<pre><code class="language-cpp">const bool matched[] = 
{ result = false || false,
  result = false || true,
  result = true || &lt;never mind...&gt;};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2256320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2256320</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 02 Oct 2012 06:09:04 GMT</pubDate></item></channel></rss>