我有一个计算字符串文字的哈希值的函数:
inline consteval uint64_t HashLiteral(const char* key)
{
// body not important here...
return 0;
}
在另一个函数中,我需要文字字符串及其哈希值,我想在编译时计算它:
void function(const char* s)
{
worker(s, HashLiteral(s));
}
然而,似乎不可能进行像
function("string")
这样的调用并在编译时在其主体中计算哈希值。我现在想到的最好方法是使用宏,并重新定义函数:
#define MakeHashParms(s) s,HashLiteral(s)
void function(const char* s, const uint64_t hash)
{
worker(s, hash);
}
function(MakeHashParms("string"));
是否可以有更直接的解决方案?
当然可以:例如:
template <size_t N>
constexpr unsigned int foo_hash(const char(&s)[N]) {
// simple hash
unsigned int h{};
for (const auto& c : s)
h = 2 * h ^ c;
return h;
}
int main()
{
constexpr unsigned int hash = foo_hash("abc");
return hash;
}
您还可以使用
std::vector
和/或 std::string
使 has 函数变得复杂。只需将其保留在 constexpr 函数内部即可。