以下代码旨在创建一种最长 8 个字符的字符串的简单哈希:
#include <type_traits>
#include <cstdint>
#include <iostream>
template<std::size_t N, std::size_t n=N>
constexpr typename std::enable_if<N<=9 && n==0,
uint64_t>::type string_hash(const char (&)[N])
{
return 0;
}
template<std::size_t N, std::size_t n=N>
constexpr typename std::enable_if<N<=9 && n!=0,
uint64_t>::type string_hash(const char (&array)[N])
{
return string_hash<N,n-1>(array) | ((array[n-1]&0xffull)<<(8*(n-1)));
}
对于普通字符串文字和 constexpr 以 NULL 结尾的字符串,它确实可以正常工作。但如果我做这样的事情:
constexpr char s2[] = {1,2,3,4,5,6,7,8,9};
std::cout << string_hash(s2) << "\n";
,输出将与字符串相同"\x1\x2\x3\x4\x5\x6\x7\x8"
。我尝试static_assert(array[N-1]==0,"Failed");
在 的定义中添加 a string_hash
,但编译器说这array[N-1]
不是常量表达式。然后我尝试声明参数constexpr
,但编译器说不能声明参数constexpr
。
那我该怎么做这个检查?