hash_constexpr
を受け取りconst char*
、新しいアルゴリズムを使用してハッシュを返す関数があります。関数はhash_constexpr
コンパイル時にハッシュを生成する必要があります。
namespace detail
{
template<size_t Count>
inline constexpr size_t countof(const char(&string)[Count])
{
return Count - 1;
}
template<typename T>
struct ascii_hash_t
{
template<typename L>
static constexpr T f(L const& data, T hash, size_t i = 0)
{
return i < countof(data) ? f(data, (hash & (~0u)) ^ (hash << 7) ^ T(data[i]), i + 1) : hash;
}
};
template<typename T, typename L>
inline constexpr T generate_ascii_hash(L const& data)
{
return detail::ascii_hash_t<T>::f(data, 0);
}
};
template<size_t Count>
inline constexpr uint32_t hash_constexpr(const char(&string)[Count])
{
return detail::generate_ascii_hash<uint32_t>(string);
}
私の問題は、hash_constexpr
関数が実際に値を返していないように見えることconstexpr
です。次のように呼び出すと:
constexpr uint32_t asd = hash_constexpr("asdasd");
次のエラーが表示されます。
Constexpr 変数 'asd' は定数式で初期化する必要があります
私は何を間違っていますか?
編集#1:
この呼び出しが正しく機能していることに注意してください。
constexpr int32_t countof_test = detail::countof("hello");
編集#2:
この呼び出しも正しく機能しているようです。
constexpr int32_t generate_ascii_hash_test = detail::generate_ascii_hash<int32_t>("asd");