Eu tenho uma função que calcula o hash de uma string literal:
inline consteval uint64_t HashLiteral(const char* key)
{
// body not important here...
return 0;
}
Em outra função, preciso da string literal e do hash que desejo calcular em tempo de compilação:
void function(const char* s)
{
worker(s, HashLiteral(s));
}
No entanto, parece impossível fazer tal chamada function("string")
e ter o hash calculado em seu corpo em tempo de compilação. O melhor que descobri agora é usar uma macro e redefinir a função:
#define MakeHashParms(s) s,HashLiteral(s)
void function(const char* s, const uint64_t hash)
{
worker(s, hash);
}
function(MakeHashParms("string"));
É possível uma solução mais direta?
Você pode modificar
function
para aceitar uma estrutura de "string com hash" que pode ser construída implicitamente a partir de um arquivoconst char*
. Se você fizer o construtor de conversãoconsteval
, poderá garantir que o hash será sempre computado em tempo de compilação.Experimente online no godbolt
O problema é que o compilador precisa gerar a versão em tempo de execução
function()
e não existe uma versão em tempo de execuçãoHashLiteral()
para fazer isso.Você tem que calcular o hash externo à
function()
função, mas não precisa usar macros para isso. Você pode usar uma estrutura como Brian sugeriu em sua resposta ou apenas fazer com que suaHashLiteral()
função agrupe a string original com o hash, por exemplo:Veja aqui: https://godbolt.org/z/b16MejEqG
ATUALIZAR:
Para maior brevidade (obrigado Brian) e legibilidade, você também pode fazer o seguinte:
Ref: https://godbolt.org/z/ssqoz91qs