constexpr模板函数的无限递归 我用CysExPR函数实现了C++中的FNV-1A函数,但遇到了一个奇怪的问题。
此版本工作正常:constexpr模板函数的无限递归 我用CysExPR函数实现了C++中的FNV-1A函数,但遇到了一个奇怪的问题。,c++,templates,generics,constants,constexpr,C++,Templates,Generics,Constants,Constexpr,此版本工作正常: template<size_t N> static constexpr uint32_t fnv1a_internal(const char (&data)[N], size_t position, uint32_t state) { return position >= N - 1 ? state : fnv1a_internal(data, position + 1, (state ^ data[position]) * 16777619U
template<size_t N>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], size_t position, uint32_t state) {
return position >= N - 1 ? state : fnv1a_internal(data, position + 1, (state ^ data[position]) * 16777619UL);
}
template<size_t N>
static constexpr uint32_t fnv1a(const char (&data)[N]) {
return fnv1a_internal(data, 0, 2166136261UL);
}
问题出在哪里?三元操作无法避免模板实例化 所以当
Position>=N-1
时,仍然实例化fnv1a\u internal
,它实例化fnv1a\u internal
,依此类推
从C++17开始,如果constexpr,则可以使用:
template<size_t N, size_t Position>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], uint32_t state) {
if constexpr (Position >= N - 1) {
return state;
} else {
return fnv1a_internal<N, Position + 1>(data, (state ^ data[Position]) * 16777619UL);
}
}
模板
静态constexpr uint32\u t fnv1a\u内部(const char和data)[N],uint32\u t状态){
如果constexpr(位置>=N-1){
返回状态;
}否则{
返回fnv1a_内部(数据,(状态^数据[位置])*16777619UL;
}
}
请添加令其震惊的实例化。
uint32_t hash = fnv1a("Hello world");
template<size_t N, size_t Position>
static constexpr uint32_t fnv1a_internal(const char (&data)[N], uint32_t state) {
if constexpr (Position >= N - 1) {
return state;
} else {
return fnv1a_internal<N, Position + 1>(data, (state ^ data[Position]) * 16777619UL);
}
}