【问题标题】:what's the difference about fib function with template?fib 函数与模板有什么区别?
【发布时间】:2021-02-14 21:32:53
【问题描述】:

这是我的代码:

template<int x>
struct factorial
{
    enum :unsigned long long{ value = x * factorial<x - 1>::value };
};

template<>
struct factorial<1>
{
    enum :unsigned long long{ value = 1 };
};

有什么区别

struct factorial<1>
{
    enum :unsigned long long{ value = 1 };
};

struct factorial<0>
{
    enum :unsigned long long{ value = 1 };
};

如果我把0换成1有什么不同? 我在我的机器和 cppinsight 上尝试了它们,没有区别和工作发现,但是 cw 说:

fatal error: recursive template instantiation exceeded maximum depth of 1024
    enum :unsigned long long{ value = x * factorial<x - 1>::value };
                                          ^
main.cpp:8:43: note: in instantiation of template class 'factorial<-1024>' requested here
main.cpp:8:43: note: in instantiation of template class 'factorial<-1023>' requested here
main.cpp:8:43: note: in instantiation of...

问题来自这里:https://www.codewars.com/kata/5a74a94f5084d72c710000de/discuss

【问题讨论】:

  • "但是 cw 说" 什么是 cw?请提供您的问题的minimal reproducible example
  • 拿一张纸并在那里执行递归。不是 C++ 问题,而是算法问题。
  • 如果将0 替换为1,然后用0 实例化模板,则没有什么可以阻止它遇到所有负数。如果您使用数字 &gt; 0 对其进行实例化,它应该仍然可以正常工作。
  • 顺便说一句,0 的阶乘应该是 1,而不是 0 * ..

标签: c++ templates fibonacci


【解决方案1】:

如果您不提供factorial&lt;0&gt; 的特化,则需要定义主模板,因此要实例化factorial&lt;0&gt;;你必须计算:

0 * factorial<0 - 1>::value;

还必须计算factorial&lt;-1&gt;::value,所以factorial&lt;-2&gt;::value等等......

一旦发生在factorial&lt;-1024&gt;,就达到了编译器的递归限制,它会因给定的错误而停止。

【讨论】:

  • 谢谢,我的问题是,为什么还是算0,是不是应该到了1就停止了,这个模板的终止条件是什么?
  • 例如,这个问题有一些代码没有设置 fac stackoverflow.com/questions/9098061/… 并且在我的机器中,代码模板 struct factorial 没有警告和错误发生,并且不写任何阶乘。
  • @ffxxee 在到达1 时确实会停止。但如果你从0 开始,它会变成负数。问题是 Test input: non-negative integers x up to 20.。 0 是不超过 20 的非负数。
  • @ffxxee 如果有人尝试将其与负数一起使用,您可以添加 static_assert (如 this)以获得很好的编译错误消息。
  • @TedLyngmo 感谢您帮助我学习如何调试模板函数
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 2022-01-03
  • 2011-06-13
  • 1970-01-01
  • 2011-11-02
相关资源
最近更新 更多