<?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[Static map initialisieren, verstehe operator std::map&amp;lt;T, U&amp;gt;() nicht]]></title><description><![CDATA[<p>Auf der Suche wie man ein static map initialisieren kann, fand ich folgende <a href="http://stackoverflow.com/questions/138600/initializing-a-static-stdmapint-int-in-c" rel="nofollow">pfiffige Lösung</a> (76) ähnlich wie bei boost, aber ohne das man die riesige Boost-Lib einbinden muss:</p>
<pre><code>// map initialisation

#include &lt;iostream&gt;
#include &lt;map&gt;

template &lt;typename T, typename U&gt;
class create_map {
  private:
    std::map&lt;T, U&gt; m_map;
  public:
    create_map(const T&amp; key, const U&amp; val) {  // Methode 1
        m_map[key] = val;
    }

    create_map&lt;T, U&gt;&amp; operator()(const T&amp; key, const U&amp; val) {  // Methode 2
        m_map[key] = val;
        return *this;
    }

    operator std::map&lt;T, U&gt;() {  // Methode 3
        return m_map;
    }
};

// Now set up e. g. error messages (error_number, error_message):
std::map&lt;int,char*&gt; errmsg = create_map&lt;int,char*&gt;
    (1,&quot;Usage&quot;)
    (2,&quot;File not found&quot;);

int main(int argc,char *argv[]) {
    return 0;
}
</code></pre>
<p>Irgendwie war (ist) es mir noch immer nicht ganz klar, warum man Methode 3 benötigt. Methode 1 ist klar, wird für den Funktionsaufruf von create_map(...) benötigt (das erste Klammerpaar gehört ja zur Funktion und ist kein Operator.</p>
<p>Methode 2 ist mir auch klar, das sind die (...)-Operatoren nach der create_map(...)-Funktion.</p>
<p>Ohne Methode 3 geht es aber nicht. Die wird, ich bin es mit dem Debugger durchgegangen (läuft vor main), benötigt. Zunächst wird Methode 1 für die erste Meldung (1,&quot;Usage&quot;) aufgerufen, dann für jede weitere Meldung ab (2,&quot;File not found&quot;) wird der überladene ()-Operator (Methode 2) aufgerufen. Ganz zum Schluss der überladene Operator (aber auch wenn es nur eine Fehlermeldung [Usage] gibt, wird der aufgerufen) aus Methode 3.</p>
<p>Ich habe es mir jetzt mal so klar gemacht (verstehe es aber nicht wirklich):</p>
<p>Er gibt die private Variable m_map der Template-Klasse create_map zurück. Aber irgendwie ist mir die Definition:</p>
<p>operator std::map&lt;T, U&gt;()</p>
<p>nicht ganz klar, warum ist das ein Operator (der ()-Operator aus Methode 2 ist mir klar). Aber obiger Operator ist ja eigentlich ein Operator &quot;Klasseninstanz()&quot; (weiß nicht wie ich das richtig ausdrücken soll), sieht für mich also nicht aus wie ein Operator.</p>
<p>p.s.: Und nein, ich habe kein C++-11 - da wäre obige Krücke nicht notwendig, da geht das mit:</p>
<p>#include &lt;map&gt;<br />
using namespace std;</p>
<p>map&lt;int, char&gt; m = {{1, 'a'}, {3, 'b'}, {5, 'c'}, {7, 'd'}};</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330487/static-map-initialisieren-verstehe-operator-std-map-lt-t-u-gt-nicht</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 06:12:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330487.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Jan 2015 00:13:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Static map initialisieren, verstehe operator std::map&amp;lt;T, U&amp;gt;() nicht on Tue, 13 Jan 2015 00:24:44 GMT]]></title><description><![CDATA[<p>Auf der Suche wie man ein static map initialisieren kann, fand ich folgende <a href="http://stackoverflow.com/questions/138600/initializing-a-static-stdmapint-int-in-c" rel="nofollow">pfiffige Lösung</a> (76) ähnlich wie bei boost, aber ohne das man die riesige Boost-Lib einbinden muss:</p>
<pre><code>// map initialisation

#include &lt;iostream&gt;
#include &lt;map&gt;

template &lt;typename T, typename U&gt;
class create_map {
  private:
    std::map&lt;T, U&gt; m_map;
  public:
    create_map(const T&amp; key, const U&amp; val) {  // Methode 1
        m_map[key] = val;
    }

    create_map&lt;T, U&gt;&amp; operator()(const T&amp; key, const U&amp; val) {  // Methode 2
        m_map[key] = val;
        return *this;
    }

    operator std::map&lt;T, U&gt;() {  // Methode 3
        return m_map;
    }
};

// Now set up e. g. error messages (error_number, error_message):
std::map&lt;int,char*&gt; errmsg = create_map&lt;int,char*&gt;
    (1,&quot;Usage&quot;)
    (2,&quot;File not found&quot;);

int main(int argc,char *argv[]) {
    return 0;
}
</code></pre>
<p>Irgendwie war (ist) es mir noch immer nicht ganz klar, warum man Methode 3 benötigt. Methode 1 ist klar, wird für den Funktionsaufruf von create_map(...) benötigt (das erste Klammerpaar gehört ja zur Funktion und ist kein Operator.</p>
<p>Methode 2 ist mir auch klar, das sind die (...)-Operatoren nach der create_map(...)-Funktion.</p>
<p>Ohne Methode 3 geht es aber nicht. Die wird, ich bin es mit dem Debugger durchgegangen (läuft vor main), benötigt. Zunächst wird Methode 1 für die erste Meldung (1,&quot;Usage&quot;) aufgerufen, dann für jede weitere Meldung ab (2,&quot;File not found&quot;) wird der überladene ()-Operator (Methode 2) aufgerufen. Ganz zum Schluss der überladene Operator (aber auch wenn es nur eine Fehlermeldung [Usage] gibt, wird der aufgerufen) aus Methode 3.</p>
<p>Ich habe es mir jetzt mal so klar gemacht (verstehe es aber nicht wirklich):</p>
<p>Er gibt die private Variable m_map der Template-Klasse create_map zurück. Aber irgendwie ist mir die Definition:</p>
<p>operator std::map&lt;T, U&gt;()</p>
<p>nicht ganz klar, warum ist das ein Operator (der ()-Operator aus Methode 2 ist mir klar). Aber obiger Operator ist ja eigentlich ein Operator &quot;Klasseninstanz()&quot; (weiß nicht wie ich das richtig ausdrücken soll), sieht für mich also nicht aus wie ein Operator.</p>
<p>p.s.: Und nein, ich habe kein C++-11 - da wäre obige Krücke nicht notwendig, da geht das mit:</p>
<p>#include &lt;map&gt;<br />
using namespace std;</p>
<p>map&lt;int, char&gt; m = {{1, 'a'}, {3, 'b'}, {5, 'c'}, {7, 'd'}};</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437246</guid><dc:creator><![CDATA[johan]]></dc:creator><pubDate>Tue, 13 Jan 2015 00:24:44 GMT</pubDate></item><item><title><![CDATA[Reply to Static map initialisieren, verstehe operator std::map&amp;lt;T, U&amp;gt;() nicht on Tue, 13 Jan 2015 00:52:48 GMT]]></title><description><![CDATA[<p><code>operator std::map&lt;T, U&gt;</code> (das ist der Name dieser Funktion) ist ein sog. <a href="http://en.cppreference.com/w/cpp/language/cast_operator" rel="nofollow">Konvertierungsoperator</a>, der in der Initialisierung</p>
<pre><code>std::map&lt;int,char*&gt; errmsg = create_map&lt;int,char*&gt;
    (1,&quot;Usage&quot;)
    (2,&quot;File not found&quot;);
</code></pre>
<p>das <code>create_map&lt;int, char*&gt;</code> Objekt überhaupt erst zu einer <code>map</code> konvertiert. Was sonst soll schließlich diesen Job übernehmen? Die Konstruktoren von `map` sind per se alle unpassend, schließlich haben wir uns <code>create_map</code> doch selbst ausgedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437247</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 13 Jan 2015 00:52:48 GMT</pubDate></item><item><title><![CDATA[Reply to Static map initialisieren, verstehe operator std::map&amp;lt;T, U&amp;gt;() nicht on Tue, 13 Jan 2015 07:55:28 GMT]]></title><description><![CDATA[<p>Anmerkung: in C++11 braucht man solche Krücken nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437260</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 13 Jan 2015 07:55:28 GMT</pubDate></item><item><title><![CDATA[Reply to Static map initialisieren, verstehe operator std::map&amp;lt;T, U&amp;gt;() nicht on Tue, 13 Jan 2015 18:32:20 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p><code>operator std::map&lt;T, U&gt;</code> (das ist der Name dieser Funktion) ist ein sog. <a href="http://en.cppreference.com/w/cpp/language/cast_operator" rel="nofollow">Konvertierungsoperator</a></p>
</blockquote>
<p>Ahhh! Jetzt (und nachdem ich es dann im Stroustrup gefunden habe - §7.3.2 in meiner deutschen 2. Auflage, &quot;Umwandlungs-Operatoren&quot;) schnackelt es. Ich muss ja aus meiner eigenen Klasse create_map eine Konvertierung zur map-Klasse durchführen.</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437390</guid><dc:creator><![CDATA[johan]]></dc:creator><pubDate>Tue, 13 Jan 2015 18:32:20 GMT</pubDate></item></channel></rss>