使用C 11 字串文字進行編譯時字串雜湊
問題:
問題:是嗎可以使用C 11 的新字串在編譯時計算字串的雜湊值文字?
答案:是的,這是可能的,但需要謹慎,因為它可能不適用於所有編譯器。
運算子:編譯時字串雜湊的運算子未明確定義。相反,使用以字串文字作為輸入的編譯時雜湊函數產生常數表達式。
用例:void foo(const std::string& value) { switch(std::hash<value>()) { case "one"_hash: one(); break; case "two"_hash: two(); break; default: other(); break; } }
一個潛在的用例是建立可以根據字串的雜湊執行不同操作的switch 語句:
範例實作: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)
enum TestEnum { CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"), };
以上是C 11 字串文字可以用於編譯時字串雜湊嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!