Следующий код предназначен для создания своего рода тривиального хэша строки длиной до 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 строк с нулевым завершением это действительно работает нормально. Но если я сделаю что-то вроде этого:
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");
в определение string_hash
, но компилятор говорит, что array[N-1]
не является константным выражением. Затем я попытался объявить параметр constexpr
, но компилятор сказал, что параметр нельзя объявить constexpr
.
Как я могу тогда сделать эту проверку?
"ugabuga"
? - person Lightness Races in Orbit   schedule 01.08.2015