我的函数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");
答案 0 :(得分:0)
问题是特定模板实例化的函数ascii_hash_t::f
不是constexpr
。这会阻止您以constexpr
执行操作。
如果符合预期,请参阅http://ideone.com/heFuFP以获取示例。