我有一个计算字符串文字的哈希值的函数:
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"));
是否可以有更直接的解决方案?
您可以修改
function
以接受“散列字符串”结构,该结构可以从const char*
. 如果您进行转换构造函数consteval
,则可以保证哈希值始终在编译时计算。在 godbolt 上在线尝试
问题是编译器必须生成运行时版本
function()
,但没有运行时版本HashLiteral()
来执行此操作。您必须计算
function()
函数外部的哈希值,但不必为此使用宏。您可以使用 Brian 在他的回答中建议的结构,或者只是让您的HashLiteral()
函数将原始字符串与哈希捆绑在一起,例如:请参阅此处: https: //godbolt.org/z/b16MejEqG
更新:
为了更加简洁(感谢布莱恩)和可读性,你也可以这样做:
参考: https: //godbolt.org/z/ssqoz91qs