ホームページ >バックエンド開発 >C++ >C 11 文字列リテラルはコンパイル時の文字列ハッシュに使用できますか?

C 11 文字列リテラルはコンパイル時の文字列ハッシュに使用できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-03 03:17:10720ブラウズ

Can C  11 String Literals Be Used for Compile-Time String Hashing?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。