を使用してキャストconst char*
するコードをいくつか書いたので、テンプレート引数として aを使用できます。コードは次のとおりです。int
constexpr
const char*
#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;
}
このコード例では、 type of out
isOUT<1494474505>
と type of out2
isOUT<106227495>
です。このコードの背後にある魔法は、 FNV ハッシュ関数conststr::hash()
を使用するconstexpr
再帰です。したがって、これは const char* の整数ハッシュを作成します。これは、うまくいけば一意のものです。
この方法についていくつか質問があります。
- これは安全に使用できる方法ですか?それとも、このアプローチは特定の用途で悪になる可能性がありますか?
- 文字数に制限されることなく、文字列ごとに異なる整数を作成する、より優れたハッシュ関数を作成できますか? (私の方法では、長さは十分です)
- 暗黙的に via にキャストするコードを作成して、
const char*
美的int constexpr
にconststr
醜い (そして時間の消費者でもある)_const
ユーザー定義の文字列リテラルを必要としないようにすることはできますか? たとえば、OUT<"String">
合法です(そして「文字列」を整数にキャストします)。
どんな助けでも大歓迎です、どうもありがとう。