String-Hashing zur Kompilierungszeit mit C 11-String-Literalen
Frage:
Ist es das? Es ist möglich, den Hash einer Zeichenfolge zur Kompilierungszeit mithilfe der neuen Zeichenfolge von C 11 zu berechnen Literale?
Antwort:
Ja, das ist möglich, erfordert aber Vorsicht, da es möglicherweise nicht mit allen Compilern funktioniert.
Operator:
Der Operator für String-Hashing zur Kompilierungszeit ist nicht explizit definiert. Stattdessen wird ein konstanter Ausdruck mithilfe einer Hash-Funktion zur Kompilierungszeit generiert, die ein Zeichenfolgenliteral als Eingabe verwendet.
Anwendungsfälle:
Ein möglicher Anwendungsfall ist das Erstellen eine Switch-Anweisung, die basierend auf dem Hash einer Zeichenfolge verschiedene Aktionen ausführen kann:
void foo(const std::string& value) { switch(std::hash<value>()) { case "one"_hash: one(); break; case "two"_hash: two(); break; default: other(); break; } }
Beispiel Implementierung:
Hier ist eine Beispielimplementierung mit einer constexpr-Funktion:
template<size_t idx> constexpr uint32_t crc32(const char * str) { // Compile-time CRC32 implementation return (crc32<idx-1>(str) >> 8) ^ crc_table[(crc32<idx-1>(str) ^ str[idx]) & 0x000000FF]; } template<> constexpr uint32_t crc32<size_t(-1)>(const char * str) { // Stop recursion return 0xFFFFFFFF; } #define COMPILE_TIME_CRC32_STR(x) (crc32<sizeof(x) - 2>(x) ^ 0xFFFFFFFF)
Diese Funktion kann wie folgt verwendet werden:
enum TestEnum { CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"), };
In diesem Beispiel , CrcVal01 wird zum Kompilierzeit-Hash der Zeichenfolge „stack-overflow“ ausgewertet.
Das obige ist der detaillierte Inhalt vonKönnen C 11-String-Literale für String-Hashing zur Kompilierungszeit verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!