Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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

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
C++ 简单C++;11三元的constexpr阶乘超过最大模板深度_C++_Templates_Recursion_C++11_Constexpr - Fatal编程技术网

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

C++ 简单C++;11三元的constexpr阶乘超过最大模板深度,c++,templates,recursion,c++11,constexpr,C++,Templates,Recursion,C++11,Constexpr,如果我使用专门化编写编译时阶乘函数,下面的代码就足够了,并且将正确地提供120作为fact1()的结果: 问题是,不管什么, Fas2总是被实例化(甚至非执行路径需要编译,见有效C++,我认为项目47或48)。您需要以某种方式使它仅在您不在末尾时实例化下一个函数。一种方法是只说“螺旋模板”,然后像@NicolBolas在评论中所说的那样使用通常的constexpr方式 另一种方法是使用中使用的一种技术。据我所知,constepr的全部要点是,您不必再使用模板参数和模板递归。您可以使用fact,它

如果我使用专门化编写编译时阶乘函数,下面的代码就足够了,并且将正确地提供120作为
fact1()
的结果:


问题是,不管什么,<代码> Fas2总是被实例化(甚至非执行路径需要编译,见有效C++,我认为项目47或48)。您需要以某种方式使它仅在您不在末尾时实例化下一个函数。一种方法是只说“螺旋模板”,然后像@NicolBolas在评论中所说的那样使用通常的

constexpr
方式


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

据我所知,
constepr
的全部要点是,您不必再使用模板参数和模板递归。您可以使用
fact
,它接受一个整数并返回阶乘。就像一个正则函数。是constexpr阶乘。如果您不需要数字而是需要类型,可以将其包装为std::numeric_constant@LeonidVolnitsky谢谢你。但我找不到std::numeric_常量的引用。@user643722——名称错误——调用了它。给定一个数字,它将返回一个类型:
integral\u constant::type
我的示例不够好。我实际上需要返回一个使用N作为模板参数的类型。但答案是正确的。谢谢。标准的解决方法是使用专门化来建立递归的基本情况,就像在第一个例子中所做的那样。
template <size_t N>
constexpr size_t fact1() { return N*fact1<N-1>(); }

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