<?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[Metaprogrammierung: Parameter-Reihenfolge sortieren]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nach einiger Zeit der C++-Abstinenz möchte ich mich wieder einer richtigen Programmiersprache widmen <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>
<p>Ich habe einen Funktionsaufruf wie (Variable Anzahl von Parametern)</p>
<pre><code>func&lt;3, 1, 4, 2&gt;(param3, param1, param4, param2)
</code></pre>
<p>und möchte anhand der Zahlen die Reihenfolge für den eigentlichen Funktionsaufruf sortieren</p>
<pre><code>my_real_func(param1, param2, param3, param4);
</code></pre>
<p>Gibt es eine Möglichkeit dies zu verwirklichen? Wer gibt mir den Gedanken Anstoß, den ich brauche? <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>
<p>Hintergrund:</p>
<p>Ich habe eine map&lt;std::string, std::string&gt;, die Attribute aus einem XML-Tag beinhalten.</p>
<p>Anhand dieser Attribute soll Code für einen Funktionsaufruf generiert werden.<br />
Meine Funktion sieht z. B. so aus:</p>
<pre><code>void my_func(const std::string&amp; name,  int value);
</code></pre>
<p>In meiner map sind nun die Werte: name-&gt;XSpille und value-&gt;42<br />
Klar kann ich nicht direkt die Zuordnung zum Variablennamen in der Signatur machen.<br />
Deswegen dachte ich an zusätzliche Konstanten für die Positionen, die aus der inkludierten Datei, in<br />
der sich auch die Funktion befindet kommen:</p>
<pre><code>static const unsigned int attribute_name = 0;
static const unsigned int attribute_value = 1;
</code></pre>
<p>Krieg ich es hin, dass ich die Parameter für den Aufruf zur Compilierzeit richtig sortiere?<br />
Ich hab also die Werte für die Parameter und den Namen der Konstante für die Position, wo sie hinsollen:<br />
attribute_name-&gt;Spille attribute_value-&gt;42<br />
Die Werte, die sich hinter den Konstanten selbst verbergen habe ich zum Zeitpunkt der Codegenerierung nicht,<br />
da ich nicht die komplette inkludierte Datei parsen kann / will.</p>
<p>Gruß<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319017/metaprogrammierung-parameter-reihenfolge-sortieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Jul 2026 07:33:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319017.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Aug 2013 22:47:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Metaprogrammierung: Parameter-Reihenfolge sortieren on Sat, 03 Aug 2013 22:47:51 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nach einiger Zeit der C++-Abstinenz möchte ich mich wieder einer richtigen Programmiersprache widmen <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>
<p>Ich habe einen Funktionsaufruf wie (Variable Anzahl von Parametern)</p>
<pre><code>func&lt;3, 1, 4, 2&gt;(param3, param1, param4, param2)
</code></pre>
<p>und möchte anhand der Zahlen die Reihenfolge für den eigentlichen Funktionsaufruf sortieren</p>
<pre><code>my_real_func(param1, param2, param3, param4);
</code></pre>
<p>Gibt es eine Möglichkeit dies zu verwirklichen? Wer gibt mir den Gedanken Anstoß, den ich brauche? <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>
<p>Hintergrund:</p>
<p>Ich habe eine map&lt;std::string, std::string&gt;, die Attribute aus einem XML-Tag beinhalten.</p>
<p>Anhand dieser Attribute soll Code für einen Funktionsaufruf generiert werden.<br />
Meine Funktion sieht z. B. so aus:</p>
<pre><code>void my_func(const std::string&amp; name,  int value);
</code></pre>
<p>In meiner map sind nun die Werte: name-&gt;XSpille und value-&gt;42<br />
Klar kann ich nicht direkt die Zuordnung zum Variablennamen in der Signatur machen.<br />
Deswegen dachte ich an zusätzliche Konstanten für die Positionen, die aus der inkludierten Datei, in<br />
der sich auch die Funktion befindet kommen:</p>
<pre><code>static const unsigned int attribute_name = 0;
static const unsigned int attribute_value = 1;
</code></pre>
<p>Krieg ich es hin, dass ich die Parameter für den Aufruf zur Compilierzeit richtig sortiere?<br />
Ich hab also die Werte für die Parameter und den Namen der Konstante für die Position, wo sie hinsollen:<br />
attribute_name-&gt;Spille attribute_value-&gt;42<br />
Die Werte, die sich hinter den Konstanten selbst verbergen habe ich zum Zeitpunkt der Codegenerierung nicht,<br />
da ich nicht die komplette inkludierte Datei parsen kann / will.</p>
<p>Gruß<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343288</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sat, 03 Aug 2013 22:47:51 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung: Parameter-Reihenfolge sortieren on Sat, 03 Aug 2013 23:41:56 GMT]]></title><description><![CDATA[<p>std::tuple bietet alles nötige. z.B.</p>
<pre><code class="language-cpp">#include &lt;tuple&gt;
#include &lt;iostream&gt;

template &lt;typename... T&gt;
void my_real_func(T&amp;&amp;... args)
{
    bool foo[] = { std::cout &lt;&lt; args &lt;&lt; ' '... };
}

template &lt;int... i, typename... T&gt;
void func(T&amp;&amp;... args)
{
    using tuple_type = std::tuple&lt;T&amp;&amp;...&gt;;
    tuple_type arg_tuple( std::forward&lt;T&gt;( args )... );
    my_real_func( std::forward&lt;typename std::tuple_element&lt;i-1, tuple_type&gt;::type&gt;( std::get&lt;i-1&gt;( arg_tuple ) )... );
}

int main()
{
    func&lt;1, 2, 3&gt;( 2, 3, 5 ); std::cout &lt;&lt; '\n';
    func&lt;2, 1, 3&gt;( 2, 3, 5 ); std::cout &lt;&lt; '\n';
    func&lt;2, 2, 2&gt;( 2, 3, 5 ); std::cout &lt;&lt; '\n';
}
</code></pre>
<p><a href="http://ideone.com/ZK88Ud" rel="nofollow">ideone</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343289</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 03 Aug 2013 23:41:56 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung: Parameter-Reihenfolge sortieren on Sun, 04 Aug 2013 00:29:57 GMT]]></title><description><![CDATA[<p>Hammergeil! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>DANKE Camper <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>
<p>EDIT: Auch wenn es nicht das ist, was ich haben wollte... Die Zahl sollte sagen, an welche Position der Parameter soll, nicht an welcher Parameter an diese Stelle soll... Aber vielleicht kriegt ich es iwie hin <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/2343290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343290</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 04 Aug 2013 00:29:57 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung: Parameter-Reihenfolge sortieren on Sun, 04 Aug 2013 08:25:19 GMT]]></title><description><![CDATA[<p>Das könnte z.B. so ausshen</p>
<pre><code class="language-cpp">#include &lt;tuple&gt;
#include &lt;iostream&gt;
#include &lt;utility&gt;

template &lt;typename T&gt;
using eval = typename T::type;
template &lt;int i&gt;
using int_ = std::integral_constant&lt;int, i&gt;;

template &lt;typename... T&gt;
void my_real_func(T&amp;&amp;... args)
{
    bool foo[] = { std::cout &lt;&lt; args &lt;&lt; ' '... };
}

template &lt;int ... i&gt;
struct value_list
{
    using type = value_list;
    static constexpr int size = sizeof...(i);
};

template &lt;int N, typename M = value_list&lt;&gt;&gt;
struct make_value_list;
template &lt;int N, int... i&gt;
struct make_value_list&lt;N,   value_list&lt;i...&gt;&gt;
     : make_value_list&lt;N-1, value_list&lt;0, 1+i...&gt;&gt; {};
template &lt;int... i&gt;
struct make_value_list&lt;0, value_list&lt;i...&gt;&gt;
     : value_list&lt;i...&gt; {};

template &lt;int x, int y&gt;
struct value_pair
{
    friend constexpr int_&lt;y&gt; lookup(int_&lt;x&gt;, value_pair) { return {}; }
    friend constexpr int_&lt;x&gt; reverse_lookup(int_&lt;y&gt;, value_pair) { return {}; }
};

template &lt;typename T, typename U = eval&lt;make_value_list&lt;T::size&gt;&gt;&gt;
struct value_map;
template &lt;int... i, int... j&gt;
struct value_map&lt;value_list&lt;i...&gt;, value_list&lt;j...&gt;&gt;
    : value_pair&lt;i, j&gt;...
{};

template &lt;int... i, typename... T, int... j&gt;
void func_(value_list&lt;j...&gt;, T&amp;&amp;... args)
{
    using tuple_type = std::tuple&lt;T&amp;&amp;...&gt;;
    tuple_type arg_tuple( std::forward&lt;T&gt;( args )... );
    using map_type = value_map&lt;value_list&lt;i...&gt;&gt;;
    my_real_func( std::forward&lt;
         eval&lt;std::tuple_element&lt;decltype(lookup(int_&lt;j+1&gt;{}, map_type{}))::value, tuple_type&gt;&gt;&gt;(
             std::get&lt;decltype(lookup(int_&lt;j+1&gt;{}, map_type{}))::value&gt;( arg_tuple ) )... );
}

template &lt;int... i, typename... T&gt;
void func(T&amp;&amp;... args)
{
    func_&lt;i...&gt;(eval&lt;make_value_list&lt;sizeof...(i)&gt;&gt;(), std::forward&lt;T&gt;( args )... );
}

int main()
{
    func&lt;5, 2, 1, 4, 3&gt;( 10, 20, 30, 40, 50 ); std::cout &lt;&lt; '\n';
}
</code></pre>
<p><a href="http://ideone.com/JDOg2n" rel="nofollow">ideone</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343298</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 04 Aug 2013 08:25:19 GMT</pubDate></item><item><title><![CDATA[Reply to Metaprogrammierung: Parameter-Reihenfolge sortieren on Sun, 04 Aug 2013 08:57:31 GMT]]></title><description><![CDATA[<p>DANKE! Genau so wollte ich es haben <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>
<p>Ich hatte mir überlegt, es nun über nen Index-Template zu machen.</p>
<p>Ich brauchte 'nur' den richtigen Denkanstoß nachdem ich (zu) lange kein C++ mehr geproggt habe...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2343305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2343305</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 04 Aug 2013 08:57:31 GMT</pubDate></item></channel></rss>