<?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[Einen Vector expandieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin auf etwas gestoßen, was ich mir nicht erklären kann. Ich möchte die Elemente eines Vektoren in der Parameterliste einer Callback-Funktion expandieren. Das muss doch irgendwie möglich sein.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;functional&gt;

namespace detail{
    template&lt;typename Func, typename... Args&gt;
    void do_(Func f, const Args&amp;... arguments){
        f(arguments...);
    }

    template&lt;typename T, typename Func, std::size_t N, typename... Args&gt;
    void expand(const std::vector&lt;T&gt;&amp; v, Func callback, const Args&amp;... arguments){
        if(sizeof...(arguments) &lt; v.size())
            return expand&lt;T, Func, N + 1&gt;(v, callback, arguments..., v[N]);

    else
        do_(callback, arguments...);
    }
}

template&lt;typename T, typename Func&gt;
void expand(const std::vector&lt;T&gt;&amp; v, Func callback){
    detail::expand&lt;T, Func, 0&gt;(v, callback);
}
</code></pre>
<p>Hier bekomme ich eine Compile-Time-Endlosrekursion, wegen Zeile 13. Aber da in der Funktion <code>detail::expand</code> der Parameter-Pack immer größer wird, verstehe ich nicht, warum <code>if(sizeof...(args)&lt;v.size())</code> nicht irgendwann einmal abbricht.</p>
<p>Kann mir das mal wer erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/340338/einen-vector-expandieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 05:38:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/340338.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Nov 2016 12:56:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einen Vector expandieren on Tue, 01 Nov 2016 12:56:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin auf etwas gestoßen, was ich mir nicht erklären kann. Ich möchte die Elemente eines Vektoren in der Parameterliste einer Callback-Funktion expandieren. Das muss doch irgendwie möglich sein.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;functional&gt;

namespace detail{
    template&lt;typename Func, typename... Args&gt;
    void do_(Func f, const Args&amp;... arguments){
        f(arguments...);
    }

    template&lt;typename T, typename Func, std::size_t N, typename... Args&gt;
    void expand(const std::vector&lt;T&gt;&amp; v, Func callback, const Args&amp;... arguments){
        if(sizeof...(arguments) &lt; v.size())
            return expand&lt;T, Func, N + 1&gt;(v, callback, arguments..., v[N]);

    else
        do_(callback, arguments...);
    }
}

template&lt;typename T, typename Func&gt;
void expand(const std::vector&lt;T&gt;&amp; v, Func callback){
    detail::expand&lt;T, Func, 0&gt;(v, callback);
}
</code></pre>
<p>Hier bekomme ich eine Compile-Time-Endlosrekursion, wegen Zeile 13. Aber da in der Funktion <code>detail::expand</code> der Parameter-Pack immer größer wird, verstehe ich nicht, warum <code>if(sizeof...(args)&lt;v.size())</code> nicht irgendwann einmal abbricht.</p>
<p>Kann mir das mal wer erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513733</guid><dc:creator><![CDATA[atze123]]></dc:creator><pubDate>Tue, 01 Nov 2016 12:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Vector expandieren on Tue, 01 Nov 2016 13:06:38 GMT]]></title><description><![CDATA[<p>atze123 schrieb:</p>
<blockquote>
<p>[...] verstehe ich nicht, warum <code>if(sizeof...(args)&lt;v.size())</code> nicht irgendwann einmal abbricht.</p>
<p>Kann mir das mal wer erklären?</p>
</blockquote>
<pre><code class="language-cpp">template &lt;int I&gt;
struct fac {
    static const int value = I == 0 ? 1 : I * fac&lt;I-1&gt;::value;
};
</code></pre>
<p>funktoniert auch nicht. Aus dem gleichen Grund. Mal ganz abgesehen davon, dass v.size() kein konstanter Ausdruck ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513735</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 01 Nov 2016 13:06:38 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Vector expandieren on Tue, 01 Nov 2016 16:38:56 GMT]]></title><description><![CDATA[<p>Ok, aber mit <code>std::array&lt;&gt;</code> und <code>std::tuple_size&lt;&gt;::size</code> erzielt es den gleichen Effekt. Obwohl konstante Compile Time Expression. Oder was genau versteh ich da falsch?</p>
<p>camper, dein Code sieht für mich irgendwie auch wie ne reine konstante Compile Time Expression aus. Liegt das an dem conditional if? Kann das nicht Compile Time sein, oder?</p>
<p>Ich habs nochmal so probiert, aber partial template specialization ist bei Funktionen leider nicht erlaubt und das finde ich auch ausgesprochen doof. Mit Klassen ginge das ja, aber dann weiß ich nicht wie ich die Callback aufrufen soll. Ich glaub dann muss die auch ne constexpr Funktion sein oder so, aber das will ich nicht.</p>
<pre><code class="language-cpp">template&lt;typename Function, typename Array, std::size_t N, typename... Arguments&gt;
void f(Function&amp;&amp; callback, const Array&amp; container, Arguments&amp;&amp;... arguments){
    f&lt;Function, Array, N - 1&gt;(callback, container, container[N], arguments...);
}

template&lt;typename Function, typename Array, typename... Arguments&gt;
void f&lt;Function, Array, 0, Arguments...&gt;(Function&amp;&amp; function, const Array&amp; array, Arguments&amp;&amp;... arguments){
    function(std::forward&lt;Arguments&gt;(arguments)...);
}
</code></pre>
<p>Wie ist mein Vorhaben möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513782</guid><dc:creator><![CDATA[atze123]]></dc:creator><pubDate>Tue, 01 Nov 2016 16:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Einen Vector expandieren on Tue, 01 Nov 2016 17:21:34 GMT]]></title><description><![CDATA[<p>atze123 schrieb:</p>
<blockquote>
<p>Ok, aber mit <code>std::array&lt;&gt;</code> und <code>std::tuple_size&lt;&gt;::size</code> erzielt es den gleichen Effekt. Obwohl konstante Compile Time Expression. Oder was genau versteh ich da falsch?</p>
</blockquote>
<p>Ja. Ich habe auf zwei Probleme hingewiesen, konstante Ausdrücke sind ist nur eines davon.<br />
Entscheidend ist zunächst einmal, dass Instantiierung von Templates und Auswertung von Ausdrücken nichts miteinander zu tun hat.<br />
Es spielt schlicht keine Rolle, welchen Wert eine Bedingung bei if, oder eines bedingten Ausdruckes hat - selbst wenn dieser bereits während des Compilierens bekannt ist - hinsichtlich der Instantiierung der Zweige der Bedingung. In</p>
<pre><code class="language-cpp">if (true) foo(); else bar();
</code></pre>
<p>wiseen wir, dass der else-Zweig nie betreten wird, syntaktisch korrekt muss er trotzdem sein, und Templates werden dafür ggf. instantiiert. Beim conditional-if kommt hinzu, dass wir den Typ des gesamten Ausdrucks nur kennen, wenn der Typ beider Zweige bekannt ist; das erfordert nat. ebenso eine Instantiierung. Gerade deshalb gehören Templatespezialisierungen zum Grundwerkzeug der Templateprogrammierung, weil Rekursionen anders nicht abzuschliessen sind.</p>
<p>Im Zusammenhang mit Paramterpacks ist es häufig so, dass diese indiziert werden können; das Problem eine Reihe von n Werten oder Typen zu erzeugen, kann dann einfach auf das Problem, eine Sequenz 0,1,...,n-1 zu erzeugen, zurückgeführt werden. Weil das so ist, gibt es ab C++14 auch in der Standardbibliothek Mittel hierfür.</p>
<pre><code class="language-cpp">template &lt;typename Function, typename Container, std::size_t... I&gt;
constexpr auto apply(Function&amp;&amp; f, Container&amp;&amp; c, std::index_sequence&lt;I...&gt;) {
    return std::forward&lt;Function&gt;(f)(std::forward&lt;Container&gt;(c)[I]...);
}

template &lt;typename Function, typename T, std::size_t N&gt;
constexpr auto apply(Function&amp;&amp; f, T(&amp;a)[N]) {
    return apply(std::forward&lt;Function&gt;(f), a, std::make_index_sequence&lt;N&gt;{});
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2513792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513792</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 01 Nov 2016 17:21:34 GMT</pubDate></item></channel></rss>