C 11 文字列リテラルを使用したコンパイル時の文字列ハッシュ
質問:
ですか? C 11 の新しい文字列を使用してコンパイル時に文字列のハッシュを計算することが可能リテラル?
答え:
はい、可能ですが、すべてのコンパイラで動作するとは限らないため、注意が必要です。
演算子:
コンパイル時の文字列ハッシュの演算子は、明示的に定義されています。代わりに、文字列リテラルを入力として受け取るコンパイル時のハッシュ関数を使用して定数式が生成されます。
使用例:
考えられる使用例の 1 つは、文字列のハッシュに基づいてさまざまなアクションを実行できる switch ステートメント:
void foo(const std::string& value) { switch(std::hash<value>()) { case "one"_hash: one(); break; case "two"_hash: two(); break; default: other(); break; } }
例実装:
constexpr 関数を使用した実装例を次に示します:
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"), };
この例では, CrcVal01 は、文字列「stack-overflow.」のコンパイル時ハッシュとして評価されます。
以上がC 11 文字列リテラルはコンパイル時の文字列ハッシュに使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。