gpt4 book ai didi

c++ - 如何约束模板化的 constexpr 递归函数输入参数

转载 作者:行者123 更新时间:2023-11-30 03:25:08 29 4
gpt4 key购买 nike

我想检查我的 constexpr 递归函数中的输入模板参数,但我发现它总是因评估整个变量范围而失败。

例子:

template<unsigned char t>
constexpr unsigned char test() {
static_assert(t < 20, "param check");
return t < 10 ? t : test<t-1>();
}

int main() {
return test<14>();
}

https://godbolt.org/g/KLgxdm

为什么会这样?还有其他方法可以在编译时检查参数吗?

最佳答案

这是因为 test<t> 的实例化总是需要实例化 test<t-1> , 因此你有一个没有停止标准的无限递归。

您可以显式特化停止条件:

template<unsigned char t>
constexpr unsigned char test() {
static_assert(t < 20, "param check");
return t < 10 ? t : test<t-1>();
}

template<>
constexpr unsigned char test<0>() {
return 0;
}

int main() {
return test<14>();
}

另一种方法是使用 if constexpr ,那么对于不满足的条件,实例化不会发生:

template<unsigned char t>
constexpr unsigned char test() {
static_assert(t < 20, "param check");
if constexpr ( t < 10 ) {
return t;
} else {
return test<t-1>();
}
}

关于c++ - 如何约束模板化的 constexpr 递归函数输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49213507/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com