<?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[enum als string ausgeben?]]></title><description><![CDATA[<p>Wie kann man enum (die Bezeichnungen) als string ausgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219283/enum-als-string-ausgeben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 11:58:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219283.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Jul 2008 19:32:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to enum als string ausgeben? on Thu, 31 Jul 2008 19:32:53 GMT]]></title><description><![CDATA[<p>Wie kann man enum (die Bezeichnungen) als string ausgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557226</guid><dc:creator><![CDATA[__enum_]]></dc:creator><pubDate>Thu, 31 Jul 2008 19:32:53 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Thu, 31 Jul 2008 19:39:43 GMT]]></title><description><![CDATA[<p>HÄÄÄH?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557231</guid><dc:creator><![CDATA[Speedy_92]]></dc:creator><pubDate>Thu, 31 Jul 2008 19:39:43 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Thu, 31 Jul 2008 19:39:46 GMT]]></title><description><![CDATA[<p>Gar nicht.</p>
<p>Bezeichner existieren zur Laufzeit nicht mehr. Bei Typen geht es eventuell noch mit <code>typeid</code> , wobei auch das nicht gewährleistet ist.</p>
<p>Ich denke, du suchst etwas wie <code>std::map</code> , also einen assoziativen Container, bei dem man als Schlüssel einen <code>std::string</code> hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557232</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 31 Jul 2008 19:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Thu, 31 Jul 2008 20:03:10 GMT]]></title><description><![CDATA[<p>apropos: geht so was eigtl iwie?</p>
<pre><code class="language-cpp">std::map &lt;const char[3], size_t&gt; test;
void Init ()
	{
		test.insert (std::make_pair &lt;const char[3], size_t&gt; (&quot;asd&quot;, 0));
	}
</code></pre>
<p>Ich will immer ganz genau 3 Buchstaben und nen Wert dazu... Und will aber auch an hand des size_t elements wieder an die 3 Buchstaben kommen - ist da überhaupt std::map die richtige Wahl?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557253</guid><dc:creator><![CDATA[asdasdasdasdasd]]></dc:creator><pubDate>Thu, 31 Jul 2008 20:03:10 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Thu, 31 Jul 2008 20:47:42 GMT]]></title><description><![CDATA[<p>Ja. Das geht.<br />
Aber da würde ich eher zu sowas raten:</p>
<pre><code class="language-cpp">std::vector&lt;string&gt; vec;
vec.push_back (&quot;aab&quot;);
vec.push_back (&quot;bba&quot;);

std::cout &lt;&lt; vec[1];
</code></pre>
<p>Ich würde dir sowieso zu string raten. Du hast da nämlich bereits einen typischen C-String Fehler drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557277</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 31 Jul 2008 20:47:42 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Thu, 31 Jul 2008 21:44:56 GMT]]></title><description><![CDATA[<p>naja... aber ich weiß ja, dass es immer 3 zeichen sind - deshalb brauch ich die terminierende 0 ja eigtl nicht - aber kA, wie ich bei &quot;asd&quot; die 0 weg bekomme - und 'a', 's', 'd' wird ja vermutlich nicht gehen?</p>
<p>zur erklärung:<br />
es sind die stati eines objektes - die empfange ich aber (via netzwerk) als string mit immer exakt 3 zeichen länge...<br />
wobei mir gerade einfällt, dass ich die 3 zeichen ja vll auch auf nen DWORD oder so casten kann? aber dann speicher ich halt 4 byte obwohl es nich mal genug stati gibt um 1 byte nicht als verschwendung anzusehen ^^</p>
<p>bis jetzt habe ich nen ganz normales enum - aber so müsst ich ja jedes mal wieder tippen if (string[0] == 'X' &amp;&amp; string[1] == 'Y' &amp;&amp; string[3] == 'Z')<br />
das suckt alles bissl &gt;&lt;</p>
<p>alternative Vorschläge?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557299</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 31 Jul 2008 21:44:56 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Thu, 31 Jul 2008 21:53:42 GMT]]></title><description><![CDATA[<p>Wie gesagt. Nutzt strings und pack das ganze in einen Container. Dann kannst du da auch ganz bequem drin suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557303</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 31 Jul 2008 21:53:42 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 05:52:25 GMT]]></title><description><![CDATA[<p>asdasdasdasdasd schrieb:</p>
<blockquote>
<p>apropos: geht so was eigtl iwie?</p>
<pre><code class="language-cpp">std::map &lt;const char[3], size_t&gt; test;
void Init ()
	{
		test.insert (std::make_pair &lt;const char[3], size_t&gt; (&quot;asd&quot;, 0));
	}
</code></pre>
<p>...</p>
</blockquote>
<p>Hmmm, welchen Vergleich verwendet die map-Implementation bei sowas eigentlich ?</p>
<p>asdasdasdasdasd schrieb:</p>
<blockquote>
<p>...<br />
Ich will immer ganz genau 3 Buchstaben und nen Wert dazu... Und will aber auch an hand des size_t elements wieder an die 3 Buchstaben kommen - ist da überhaupt std::map die richtige Wahl?...</p>
</blockquote>
<p>Also in der map kann man nach dem value-Typ (hier size_t) nicht genauso effizient suchen wie nach dem key-Typ (hier char const[3]), weswegen (multi)map eine gute Wahl ist, wenn man nach einem von beiden deutlich häufiger sucht als nach dem Anderen (und auch häufiger sucht als einfügt/löscht).<br />
Muss man halt mal sehen, ob der Performancemäßig eine Rolle spielt....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557346</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 01 Aug 2008 05:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 06:07:42 GMT]]></title><description><![CDATA[<p>asdasdasdasdasd schrieb:</p>
<blockquote>
<p>apropos: geht so was eigtl iwie?</p>
<pre><code class="language-cpp">std::map &lt;const char[3], size_t&gt; test;
void Init ()
	{
		test.insert (std::make_pair &lt;const char[3], size_t&gt; (&quot;asd&quot;, 0));
	}
</code></pre>
</blockquote>
<p>Nein, geht nicht. Weil bei der Übergabe von make_pair an pair die Größeninformation verlorengeht, da das Array nicht als Referenz übergeben wird. Damit wird ein std::pair&lt;char const[3],size_t&gt; mit einem char const* initialisiert.</p>
<p>Selbst wenn man das umgeht, indem man statt make_pair direkt den pair-Konstruktor nutzt, müssten in eben diesem zwei Arrays einander zugewiesen werden, was der Standard verbietet.</p>
<p>(EDIT: Mit dem für &quot;asd&quot; korrekten Typ char const[4] gilt übrigens dasselbe. Bevor jemand schreit :D)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557353</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 01 Aug 2008 06:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 06:36:18 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>asdasdasdasdasd schrieb:</p>
<blockquote>
<p>apropos: geht so was eigtl iwie?</p>
<pre><code class="language-cpp">std::map &lt;const char[3], size_t&gt; test;
void Init ()
	{
		test.insert (std::make_pair &lt;const char[3], size_t&gt; (&quot;asd&quot;, 0));
	}
</code></pre>
<p>...</p>
</blockquote>
<p>Hmmm, welchen Vergleich verwendet die map-Implementation bei sowas eigentlich ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>würde sagen : operator &lt;, und dann wohl einfach die pointer-werte (adressen)<br />
also nichts mit strcmp, das wäre dann auch effizienter als operator &lt; von<br />
nem string</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557363</guid><dc:creator><![CDATA[Treb]]></dc:creator><pubDate>Fri, 01 Aug 2008 06:36:18 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 07:00:00 GMT]]></title><description><![CDATA[<p>Treb schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Hmmm, welchen Vergleich verwendet die map-Implementation bei sowas eigentlich ?</p>
</blockquote>
<p>operator &lt;</p>
</blockquote>
<p>Korrekt. map arbeitet auf einer Äquivalenzrelation (&quot;strict weak ordering&quot;). Gleichheit wird definiert über !(a&lt;b) &amp;&amp; !(b&lt;a) . Beim Definieren eines eigenen operator&lt; für die Verwendung von map muss man peinlich genau auf die Einhaltung der Bedingungen eines strict weak ordering achten, da map (und set) sonst nicht richtig funktionieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557375</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 01 Aug 2008 07:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 07:03:28 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>es sind die stati eines objektes</p>
</blockquote>
<p>Der Plural von „status“ ist übrigens „status“ mit einem langen zweiten „u“: u-Deklination. (Und ja, auch auf Deutsch.)</p>
<p>&lt;/klugscheiss&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557378</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 01 Aug 2008 07:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 07:58:56 GMT]]></title><description><![CDATA[<p>Treb schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>...<br />
Hmmm, welchen Vergleich verwendet die map-Implementation bei sowas eigentlich ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>würde sagen : operator &lt;, und dann wohl einfach die pointer-werte (adressen)...</p>
</blockquote>
<p>Das hätte ich auch mal vermutet ... weswegen ich auch dachte, dass das obige Konstrukt eben nicht (im erwarteten Sinne) &quot;geht&quot;.</p>
<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>...Beim Definieren eines eigenen operator&lt; für die Verwendung von map muss man peinlich genau auf die Einhaltung der Bedingungen eines strict weak ordering achten, da map (und set) sonst nicht richtig funktionieren kann.</p>
</blockquote>
<p>Das war mir durchaus bekannt - aber mir ist eben nicht klar, ob es std::map-Implementierungen nicht erlaubt wäre, entweder einen entsprechenden operator&lt;() zu definieren (zumindestens für NTBS) oder eine passenden Spezialisierung für char* anzubieten, die mit geeignetem Vergleich arbeitet...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557393</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 01 Aug 2008 07:58:56 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 08:01:36 GMT]]></title><description><![CDATA[<p>enum2str kann man sich ja selber basteln. Mit Hilfe von defines geht es auch relativ simpel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#define ENUM2STR_BEGIN(VAR) switch( VAR ){
#define ENUM2STR(EN) case EN: return std::string( #EN );
#define ENUM2STR_END(ERR) }; return std::string( ERR );

enum Horst{
    Uwe,
    Klaus,
    Peter
};

std::string Enum2Str_Horst(Horst h){
    ENUM2STR_BEGIN(h);
    ENUM2STR(Uwe);
    ENUM2STR(Klaus);
    ENUM2STR(Peter);
    ENUM2STR_END(&quot;unknown enum&quot;);
}

int main(int argc, char *argv[]){
    Horst h = Uwe;
    std::cout &lt;&lt; Enum2Str(h) &lt;&lt; std::endl;
}
</code></pre>
<p>Vermutlich gibt es noch ein paar Makros mit denen das einfacher geht, vielleicht auch nicht. *shrug*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557397</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 01 Aug 2008 08:01:36 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 08:06:30 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Das war mir durchaus bekannt - aber mir ist eben nicht klar, ob es std::map-Implementierungen nicht erlaubt wäre, entweder einen entsprechenden operator&lt;() zu definieren (zumindestens für NTBS) oder eine passenden Spezialisierung für char* anzubieten, die mit geeignetem Vergleich arbeitet...</p>
</blockquote>
<p>Ah achso. <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="🙂"
    /> Als drittes Template-Argument kannst du an map eine Komparator-Klasse angeben, die die Vergleiche macht. Default ist meine ich std::less&lt;Key&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557399</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 01 Aug 2008 08:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 08:07:16 GMT]]></title><description><![CDATA[<p>Ist die Betrachtung nicht müßig, wenn's sowieso nicht geht? <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/1557402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557402</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 01 Aug 2008 08:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 08:35:19 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Ist die Betrachtung nicht müßig, wenn's sowieso nicht geht? <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>Think encapsulation. Mit einem <code>std::tr1::array&lt;char, 3&gt;</code> sollte es doch wunderbar gehen, oder übersehe ich da etwas?</p>
<p>Das ist zwar eine seehr voreilige Optimierung aber mir fallen als Bioinformatiker spontan mindestens zwei Anwendungen ein, in denen das wirklich Sinn ergeben würde (nein, tut's nicht, weil 'map' keine Hashtabelle ist, mit der <code>std::tr1::unordered_map</code> sieht die Sache aber schon anders aus).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557409</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 01 Aug 2008 08:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 08:44:04 GMT]]></title><description><![CDATA[<p>Hast recht, wobei in diesem Fall wieder ein Benutzerdefinierter Operator für den Array greifen kann (was bei nicht-UDTs ja nicht geht). Ich dachte darum ging es bei der Nebenfrage in erster Linie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557420</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 01 Aug 2008 08:44:04 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 09:06:14 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>enum2str kann man sich ja selber basteln. Mit Hilfe von defines geht es auch relativ simpel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#define ENUM2STR_BEGIN(VAR) switch( VAR ){
#define ENUM2STR(EN) case EN: return std::string( #EN );
#define ENUM2STR_END(ERR) }; return std::string( ERR );

enum Horst{
    Uwe,
    Klaus,
    Peter
};

std::string Enum2Str_Horst(Horst h){
    ENUM2STR_BEGIN(h);
    ENUM2STR(Uwe);
    ENUM2STR(Klaus);
    ENUM2STR(Peter);
    ENUM2STR_END(&quot;unknown enum&quot;);
}

int main(int argc, char *argv[]){
    Horst h = Uwe;
    std::cout &lt;&lt; Enum2Str(h) &lt;&lt; std::endl;
}
</code></pre>
<p>Vermutlich gibt es noch ein paar Makros mit denen das einfacher geht, vielleicht auch nicht. *shrug*</p>
</blockquote>
<p>Das funktioniert aber nicht, wenn man mehrere Enum-Flags in einer Variablen hat, was doch sehr häufig der Verwendungszweck von Enums ist. Wobei du es leicht ändern könntest, so dass es alle benutzen Flags zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557438</guid><dc:creator><![CDATA[Kombinierer]]></dc:creator><pubDate>Fri, 01 Aug 2008 09:06:14 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 09:35:08 GMT]]></title><description><![CDATA[<p>Dann ist es aber auch kein &quot;gültiger&quot; Enum-Wert mehr, sondern eben eine Kombination eben jener. Und darum ging es nicht. <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/1557459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557459</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 01 Aug 2008 09:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 11:29:48 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Think encapsulation. Mit einem <code>std::tr1::array&lt;char, 3&gt;</code> sollte es doch wunderbar gehen, oder übersehe ich da etwas?</p>
</blockquote>
<p>Ist das <code>std::tr1::array</code> gleich dem <code>boost::array</code> ?<br />
Dann gibt es nämlich Probleme, allerdings mehr in der Bequemlichkeit.<br />
<code>boost::array</code> hat keine Konstruktoren, wodurch jegliche implizite Umwandlung unmöglich ist. Desweiteren haben mir noch keine rohen Strings, sondern alle sind noch mit einem '\0' abgeschlossen. Bsp:</p>
<pre><code class="language-cpp">#include &lt;boost/array.hpp&gt;

#include &lt;map&gt;
#include &lt;string&gt;

int main()
{
  typedef boost::array&lt;char, 3&gt; Array_t;
  typedef std::map&lt;Array_t, int&gt; FirstMap_t;
  typedef std::map&lt;std::string, int&gt; SecondMap_t;

  Array_t tempArray;
  FirstMap_t firstMap;
  SecondMap_t secondMap;

  // Zuerst mit dem Array:
  char const* p = &quot;abc&quot;;
  tempArray.assign(p, p + 3); // Unter VS noch warnings ...
  firstMap[tempArray] = 0; // zusätzliche Kopie!

  // usw.

  // Dann mit dem std::string:
  secondMap[&quot;abc&quot;] = 0; // irgendwie angenehmer, nicht?

  return 0;
}
</code></pre>
<p>Zudem wenn man noch bedenkt, was für Optimierungen der Compiler machen kann, dann würde ich persönlich bei einer <code>std::map</code> eher den <code>std::string</code> nehmen. Alles andere ist Mikrooptimierung, welche allenfalls später durchgeführt werden kann. Kann mir aber schlecht vorstellen, dass es dadurch einen Geschwindigkeitsverlust geben wird.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557536</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 01 Aug 2008 11:29:48 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Fri, 01 Aug 2008 12:00:39 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Think encapsulation. Mit einem <code>std::tr1::array&lt;char, 3&gt;</code> sollte es doch wunderbar gehen, oder übersehe ich da etwas?</p>
</blockquote>
<p>Ist das <code>std::tr1::array</code> gleich dem <code>boost::array</code> ?<br />
Dann gibt es nämlich Probleme, allerdings mehr in der Bequemlichkeit.<br />
<code>boost::array</code> hat keine Konstruktoren</p>
</blockquote>
<p>Dafür aber Array-Initializer, die hier evtl. sowieso besser geeignet sind.</p>
<pre><code class="language-cpp">typedef array&lt;char, 3&gt; tlc_t;
typedef map&lt;tlc_t, char, tlc_comp&gt; tlc_to_aa_t;

tlc_t a = {{ 'a', 'l', 'a' }};
tlc_t g = {{ 'g', 'l', 'y' }};
// … etc.

tlc_to_aa_t tr;
tr[a] = 'a';
tr[g] = 'g';
// … etc.
</code></pre>
<blockquote>
<p>Zudem wenn man noch bedenkt, was für Optimierungen der Compiler machen kann, dann würde ich persönlich bei einer <code>std::map</code> eher den <code>std::string</code> nehmen. Alles andere ist Mikrooptimierung, welche allenfalls später durchgeführt werden kann. Kann mir aber schlecht vorstellen, dass es dadurch einen Geschwindigkeitsverlust geben wird.</p>
</blockquote>
<p>Ha. Na ja. In unserem Bioinformatik-Software-Framework haben wir für alle möglichen Konvertierungen hartcodierte Übersetzungstabellen und die bringen definitiv einen Geschwindigkeitsvorteil. Aber zugegeben, hier sind solche Dinge auch wirklich wichtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557569</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 01 Aug 2008 12:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to enum als string ausgeben? on Sat, 20 Mar 2010 23:20:44 GMT]]></title><description><![CDATA[<p>Der Beitrag ist nicht ganz frisch, trotzdem wollte ich meinen Vorschlag auch posten. Ich habe für enum-string Konvertierung ein Perl-Skript geschrieben, das eine Klasse mit vielen überladenen toString-Methoden erzeugt.<br />
Die C++ Dateien werden nicht mit Perl geparst sondern es wird zuvor die tags-Datei mit dem Tool ctags erzeugt.<br />
Hier ist das Skript:</p>
<pre><code>#!/bin/perl
# Valentin Heinitz, 2010-03-20
# Script for making C++ class which converts enum to string.
# Version: 0.01
# This script is Public Domain. Copy, modify and redistribute it as you want.
# The software is provided &quot;as is&quot;, without warranty of any kind.
#
# Call it from Source-code root-directory with command-line:
# perl enum2string.pl &gt; &lt;ToStringClassFileName.h&gt;
use strict;
use warnings;
#Found enum types will be added to this list
my @etypes=();
#Found includes will be added to this list
my @includes=();

# Pattern for searching enum types and corresponding include-file.
my $pat=&quot;^[^\t]+\t([^\t]+)\t.*enum:([a-zA-Z_][a-zA-Z0-9_]*)&quot;;
my $file = &quot;tags&quot;;

system &quot;ctags -R *&quot;;

open T, &quot;&gt;tmp&quot; or die &quot;couldn't open tmp\n&quot;;
open F, $file or die &quot;couldn't open $file\n&quot;;

#Replacing MS-Windows paths by UNIX paths (for includes)
while (&lt;F&gt;) {
 $_ =~ s/\\/\//;
 print T &quot;$_&quot;;
}
close F;
close T;

$file=&quot;tmp&quot;;

open F, $file or die &quot;couldn't open $file\n&quot;;
while (&lt;F&gt;) {
  if (my ($m) = m/$pat/){
    $etypes[++$#etypes] = $2;
    $includes[++$#includes] = $1;
    #print &quot;$_\n&quot;;
  }
}
close F;

#Class name to be generated. Change as you like, or set from argument
my $clName = 'EnumToString';

#Remove duplicates from enum type list
my %hlp1 = ();
my @uniqenums = grep { ! $hlp1{$_} ++ } @etypes;

#Remove duplicates from include list
my %hlp2 = ();
my @uniqinc = grep { ! $hlp2{$_} ++ } @includes;

print &quot;#ifndef _H_G__$clName\n&quot;;
print &quot;#define _H_G__$clName\n\n&quot;;
print &quot;#include &lt;iostream&gt;\nusing std::cout;\n&quot;;

foreach my $inc (@uniqinc)
{
  print &quot;#include \&quot;$inc\&quot;\n&quot;;
}

print &quot;\n\n&quot;;

print &quot;class $clName {\n&quot;;
print &quot;  EnumToString(); // utility class, no instances\n\n&quot;;
print &quot;public:\n&quot;;

foreach my $k (@uniqenums)
{
  $pat = &quot;^([a-zA-Z0-9_]*)\t.*e\tenum:$k&quot;;
  print &quot;  static const char * toString( $k en ) {\n&quot;;
  print &quot;    switch( en ) {\n&quot;;
  open F, $file or die &quot;couldn't open $file\n&quot;;
  while (&lt;F&gt;) {
    if (my ($m) = m/$pat/){
      print &quot;      case $1: return \&quot;$1\&quot;;\n&quot;;
    }
  }
  close F;
  print &quot;    }\n&quot;;
  print &quot;  }\n\n&quot;;

}

#Test
print &quot;static void testEnum2String() {\n&quot;;
foreach my $k (@uniqenums)
{
  $pat = &quot;^([a-zA-Z0-9_]*)\t.*e\tenum:$k&quot;;
  print &quot;  std::cout &lt;&lt; \&quot;Enums of $k:\\n\&quot;;\n&quot;;
  open F, $file or die &quot;couldn't open $file\n&quot;;
  while (&lt;F&gt;) {
    if (my ($m) = m/$pat/){
      print &quot;  std::cout &lt;&lt;\&quot;   \&quot;&lt;&lt;  toString( $1 ) &lt;&lt;\&quot; -&gt; \&quot; &lt;&lt; $1 &lt;&lt;\&quot;\\n\&quot;;\n&quot;;
    }
  }
  close F;
}
print &quot;  }\n\n&quot;;

print &quot;};\n\n&quot;;
print &quot;#endif\n&quot;;
</code></pre>
<p>Die komplete Beschreibung mit dem Beispielprojekt ist auf meiner Webseite zu finden:<br />
<a href="http://heinitz-it.de/archives/date/2010/03" rel="nofollow">http://heinitz-it.de/archives/date/2010/03</a></p>
<p>Gruß,<br />
Valentin Heinitz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871831</guid><dc:creator><![CDATA[vheinitz]]></dc:creator><pubDate>Sat, 20 Mar 2010 23:20:44 GMT</pubDate></item></channel></rss>