Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
constexpr模板函数的无限递归 我用CysExPR函数实现了C++中的FNV-1A函数,但遇到了一个奇怪的问题。_C++_Templates_Generics_Constants_Constexpr - Fatal编程技术网

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);
    }
}