不幸的是,我知道没有办法完全按照您的意愿行事。
您可以对琴弦施加任何限制吗?比如字符数?如果您可以将其限制为 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 个字符长的字符串创建一个编译时数值(可用于 aswitch
和所有优点)。不幸的是,唯一的大缺点是你不能把它写成字符串文字,你需要把它写成char
s的列表