0

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");
4

1 に答える 1