具有三元的简单C ++ 11 constexpr阶乘超过最大模板深度

时间:2012-09-03 21:06:24

标签: c++ templates recursion c++11 constexpr

如果我使用specialized编写编译时阶乘函数,下面的代码就足够了,并且fact1<5>()会正确地提供120:

template <size_t N>
constexpr size_t fact1() { return N*fact1<N-1>(); }

template <>
constexpr size_t fact1<0>() { return 1; }

但是,对于单个函数体和三元运算符,如下面的代码所示,G ++ 4.7和Clang ++ 3.2都超过了它们的最大模板实例化深度。似乎永远不会从1返回fact2。为什么fact2<5>()的这个定义不会返回120?

template <size_t N>
constexpr size_t fact2() { return N==0 ? 1 : N*fact2<N-1>(); }

1 个答案:

答案 0 :(得分:7)

这里的问题是无论如何,fact2<N-1> 总是被实例化(甚至需要编译非执行路径,请参阅有效的C ++,我认为第47或48项) 。如果你不在最后,你需要以某种方式使它只实例化下一个函数。一种方法是简单地说“螺丝模板”并按照通常的constexpr方式进行,正如@NicolBolas在评论中所说的那样。

另一种方法是使用this similar question中使用的一种技术。