残念ながら、私はあなたが望むことを正確に行う方法を知りません。
文字列に制限はありますか?文字数は?1〜8文字に制限できる場合は、次のようにすることができます。
template <char Ch1, char Ch2 = '\0', char Ch3 = '\0', char Ch4 = '\0', char Ch5 = '\0', char Ch6 = '\0', char Ch7 = '\0', char Ch8 = '\0'>
struct string_hash {
static const uint64_t value =
(static_cast<uint64_t>(Ch1) << 56) |
(static_cast<uint64_t>(Ch2) << 48) |
(static_cast<uint64_t>(Ch3) << 40) |
(static_cast<uint64_t>(Ch4) << 32) |
(static_cast<uint64_t>(Ch5) << 24) |
(static_cast<uint64_t>(Ch6) << 16) |
(static_cast<uint64_t>(Ch7) << 8) |
(Ch8);
};
これは基本的に、コンパイル時に8
文字まで詰め込みますuint64_t
。使用法は次のようになります。
const uint64_t x = string_hash<'T', 'e', 's', 't'>::value
これにより、1〜8文字の長さの各文字列に固有のコンパイル時の数値(switch
およびそのすべての機能で使用できます)が作成されます。残念ながら、唯一の大きな欠点は、文字列リテラルとして記述できないことです。リストとして記述する必要がありますchar
。