À l'aide de “constexpr” pour utiliser la chaîne de caractères littérale pour le paramètre de modèle

J'ai écrit un code de jeter const char* à int en utilisant constexpr et donc je peux utiliser un const char* comme un argument de modèle. Voici le code:

#include <iostream>
class conststr
{
public:
template<std::size_t N>
constexpr conststr(const char(&STR)[N])
:string(STR), size(N-1)
{}
constexpr conststr(const char* STR, std::size_t N)
:string(STR), size(N)
{}
constexpr char operator[](std::size_t n)
{
return n < size ? string[n] : 0;
}
constexpr std::size_t get_size()
{
return size;
}
constexpr const char* get_string()
{
return string;
}
//This method is related with Fowler–Noll–Vo hash function
constexpr unsigned hash(int n=0, unsigned h=2166136261)
{
return n == size ? h : hash(n+1,(h * 16777619) ^ (string[n]));
}
private:
const char* string;
std::size_t size;
};
//output function that requires a compile-time constant, for testing
template<int N> struct OUT
{
OUT() { std::cout << N << '\n'; }
};
int constexpr operator "" _const(const char* str, size_t sz)
{
return conststr(str,sz).hash();
}
int main()
{
OUT<"A dummy string"_const> out;
OUT<"A very long template parameter as a const char*"_const> out2;
}

Dans cet exemple de code, le type de out est OUT<1494474505> et le type de out2 est OUT<106227495>. La magie derrière ce code est conststr::hash() c'est un constexpr la récursivité qui utilise FNV fonction de Hachage. Et ainsi, il crée intégrante de hachage pour const char* qui, je l'espère, d'un genre unique.

J'ai quelques questions au sujet de cette méthode:

  1. Est-ce une approche sécuritaire à utiliser? Ou cela peut-il être un mal à un usage spécifique?
  2. Pouvez-vous écrire une meilleure fonction de hachage qui crée différentes entier pour chaque chaîne, sans être limité à un nombre de caractères? (dans ma méthode, la durée est assez longue)
  3. Pouvez-vous écrire un code qui, implicitement, jette const char* à int constexpr via conststr et donc nous n'aurons pas besoin esthétiquement laid (et aussi le temps des consommateurs) _const chaîne définie par l'utilisateur littérale? Par exemple OUT<"String"> juridique (et fonte "Chaîne" en entier).

Toute aide sera appréciée, merci beaucoup.

  • Si ma réponse decide à votre question, pouvez la marquer comme acceptée ? Sinon, vous pouvez commenter (encore une fois)!
  • Oh, toutes mes excuses, j'oublie toujours de le faire 🙂