<?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[String in Hash umwandeln - zur Kompilierzeit]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es irgendeine Möglichkeit, einen String zur Kompilierzeit in einen Hash umzuwandeln, damit ich Switch-Case-Konstrukte abwickeln kann?</p>
<p>Scheinbar nehmen Templates keine Zeichenkettensymbole ...</p>
<p>Die entsprechende statische Hash-Methode:</p>
<pre><code class="language-cpp">const int Helper::hash( const string s ) {
   int h = 0;      
   for (unsigned int i=0; i&lt;s.length(); i++)
            h = 31*h + s[i];
   return h;
}
</code></pre>
<p>In den unten stehenden case-Zweigen sollen zur Kompilierzeit die Zeichenkettenkonstanten in die entsprechenden Hash-Werte umgewandelt werden, denn so wie unten funktioniert das nicht, da case konstante Werte benötigt! Bei switch muss die Hash-Funktion jedoch zur Laufzeit aufgerufen werden!</p>
<p>Ist dies irgendwie mit einem</p>
<pre><code class="language-cpp">template&lt;const char * c&gt; struct hash
</code></pre>
<p>oder so möglich?</p>
<pre><code class="language-cpp">void Pkw::setFahrzeugklasse( string fzkl )
{
//Die Methode soll nachher erweiterbar sein, sodass in den Case-Zweigen verschiedene Attribute gesetzt werden!
	switch( Helper::hash(fzkl) )
	{
	 case Helper::hash(&quot;Kleinwagen&quot;):   ;
	 case Helper::hash(&quot;Mittelklasse&quot;): ;
	 case Helper::hash(&quot;Luxusklasse&quot;):
	     fahrzeugklasse = fzkl; break;
	 default: break;
	}
}
</code></pre>
<p>Ich würde mich über eine Antwort sehr freuen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306834/string-in-hash-umwandeln-zur-kompilierzeit</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 04:39:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306834.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 08 Aug 2012 13:52:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String in Hash umwandeln - zur Kompilierzeit on Wed, 08 Aug 2012 14:02:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es irgendeine Möglichkeit, einen String zur Kompilierzeit in einen Hash umzuwandeln, damit ich Switch-Case-Konstrukte abwickeln kann?</p>
<p>Scheinbar nehmen Templates keine Zeichenkettensymbole ...</p>
<p>Die entsprechende statische Hash-Methode:</p>
<pre><code class="language-cpp">const int Helper::hash( const string s ) {
   int h = 0;      
   for (unsigned int i=0; i&lt;s.length(); i++)
            h = 31*h + s[i];
   return h;
}
</code></pre>
<p>In den unten stehenden case-Zweigen sollen zur Kompilierzeit die Zeichenkettenkonstanten in die entsprechenden Hash-Werte umgewandelt werden, denn so wie unten funktioniert das nicht, da case konstante Werte benötigt! Bei switch muss die Hash-Funktion jedoch zur Laufzeit aufgerufen werden!</p>
<p>Ist dies irgendwie mit einem</p>
<pre><code class="language-cpp">template&lt;const char * c&gt; struct hash
</code></pre>
<p>oder so möglich?</p>
<pre><code class="language-cpp">void Pkw::setFahrzeugklasse( string fzkl )
{
//Die Methode soll nachher erweiterbar sein, sodass in den Case-Zweigen verschiedene Attribute gesetzt werden!
	switch( Helper::hash(fzkl) )
	{
	 case Helper::hash(&quot;Kleinwagen&quot;):   ;
	 case Helper::hash(&quot;Mittelklasse&quot;): ;
	 case Helper::hash(&quot;Luxusklasse&quot;):
	     fahrzeugklasse = fzkl; break;
	 default: break;
	}
}
</code></pre>
<p>Ich würde mich über eine Antwort sehr freuen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240089</guid><dc:creator><![CDATA[Spixi]]></dc:creator><pubDate>Wed, 08 Aug 2012 14:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to String in Hash umwandeln - zur Kompilierzeit on Wed, 08 Aug 2012 15:03:21 GMT]]></title><description><![CDATA[<p>In C++11 mit constexpr usw.: ja. In C++03: nein <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/2240123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240123</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 08 Aug 2012 15:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to String in Hash umwandeln - zur Kompilierzeit on Wed, 08 Aug 2012 15:09:46 GMT]]></title><description><![CDATA[<p>Ich habe es gerade gelesen:</p>
<blockquote>
<p>C++11 removes the restriction that the variables must be of integral or enumeration type if they are defined with the constexpr keyword.</p>
</blockquote>
<p>Welche Version von gcc benötige ich dafür?</p>
<p>Ich habe im Moment die Version 4.5.2 (benutze Slackware 1.3.37) ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240124</guid><dc:creator><![CDATA[Spixi]]></dc:creator><pubDate>Wed, 08 Aug 2012 15:09:46 GMT</pubDate></item><item><title><![CDATA[Reply to String in Hash umwandeln - zur Kompilierzeit on Wed, 08 Aug 2012 15:11:04 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>In C++03: nein <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>
</blockquote>
<p>In C++03: Möglich, aber mühsam (man nehme z.B. Boost.MPL.String dafür). Bei der gegebenen Hash-Methode ist das aber sicher noch machbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240127</guid><dc:creator><![CDATA[correct0r]]></dc:creator><pubDate>Wed, 08 Aug 2012 15:11:04 GMT</pubDate></item><item><title><![CDATA[Reply to String in Hash umwandeln - zur Kompilierzeit on Wed, 08 Aug 2012 15:14:25 GMT]]></title><description><![CDATA[<p>@correct0r: geht das auch ohne die Boost libraries?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240128</guid><dc:creator><![CDATA[Spixi]]></dc:creator><pubDate>Wed, 08 Aug 2012 15:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to String in Hash umwandeln - zur Kompilierzeit on Wed, 08 Aug 2012 15:46:27 GMT]]></title><description><![CDATA[<p>Boost kocht ja auch nur mit Wasser. richte dich aber darauf ein, dass es mühsam, zeitaufwendig und alles andere als einfach ohne Boost wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240140</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 08 Aug 2012 15:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to String in Hash umwandeln - zur Kompilierzeit on Wed, 08 Aug 2012 16:21:38 GMT]]></title><description><![CDATA[<p>Braucht das hier überhaupt einen Hash? Das sieht hier doch nach einem sehr übertriebenen Anwendungsfall aus. Falls es doch unbedingt Hashes sein müssen, dann hat man hier doch aber wenigstens eine überschaubare Menge an Möglichkeiten. Dann kann man sich die Hashes doch auch vorher explizit ausrechnen lassen. Oder zur Not zur Laufzeit eine map aller Möglichkeiten generieren (damit man auch garantiert die richtige Hashfunktion hat), die Zeit dazu sollte klein sein gegenüber der Zeit zum Nachschlagen, wenn man schon der Meinung war, einen Hashlookup zu benötigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240151</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 08 Aug 2012 16:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to String in Hash umwandeln - zur Kompilierzeit on Wed, 08 Aug 2012 18:38:36 GMT]]></title><description><![CDATA[<p>Mit modernem C++ relativ einfach (bei g++ gibt es constexpr-Unterstützung ab 4.6)</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;string&gt;
#include &lt;iostream&gt;

template &lt;std::size_t N&gt;
constexpr int hash(const char(&amp;s)[N], std::size_t pos = N-2) {
   return pos == 0 ? s[pos] : s[pos] + 31 * hash( s, pos - 1 );
}
int hash(std::string s) {
   int h = 0;
   for (unsigned int i=0; i&lt;s.length(); i++)
            h = 31*h + s[i];
   return h;
}

int main()
{
    std::string x = &quot;test&quot;;
    switch ( hash(x) )
    {
    case hash(&quot;a&quot;): std::cout &lt;&lt; &quot;a\n&quot;; break;
    case hash(&quot;test&quot;): std::cout &lt;&lt; &quot;test\n&quot;; break;
    default: std::cout &lt;&lt; &quot;default\n&quot;;
    }
}
</code></pre>
<p>in C++03 nicht völlig unmöglich aber umständlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240201</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 08 Aug 2012 18:38:36 GMT</pubDate></item></channel></rss>