gpt4 book ai didi

c++ - 模板元编程递归上限?

转载 作者:IT老高 更新时间:2023-10-28 22:34:22 26 4
gpt4 key购买 nike

我正在编写一个非常简单的模板类,使用元编程来计算编译时的总和,如下所示:

#include <iostream>

using namespace std;

template<int N>
class Sum
{
public:
enum {value = N + Sum<N-1>::value };
};

template<>
class Sum<0>
{
public:
enum {value = 0};
};


int main()
{
cout << Sum<501>::value << endl;
}

有趣的是:

  • 当我打印 Sum<500> 及以下时,它工作正常
  • Sum<501> 编译失败:

    sum.cpp:9: instantiated from Sum<500>' sum.cpp:9: instantiated
    from
    Sum<501>' sum.cpp:22: instantiated from here

    sum.cpp:9: error: incomplete type Sum<1>' used in nested name
    specifier sum.cpp:9: error: enumerator value for
    value' not integer constant

  • Sum<501>会报Sum<1>的错误,Sum<502>会报Sum<2>的错误,差总是2,在我看来编译器有500的限制资源.

对此有任何想法吗?他们是打破这个限制的方法吗?

谢谢。

编辑:
谢谢大家,重点不在于算法,而在于编译器限制 - 我知道有一种简单的方法可以得到总和:)

编辑2:

  • 使用 gcc 4.6 +,错误信息更有帮助

    sum.cpp:9:14: error: template instantiation depth exceeds maximum of 1024 (use -ftemplate-depth= to increase the maximum) instantiating ‘class Sum<1>’ sum.cpp:9:14: recursively instantiated from ‘Sum<1024>’ sum.cpp:9:14: instantiated from ‘Sum<1025>’ sum.cpp:22:22: instantiated from here

所以是的,使用 ftemplate-depth 是正确的方法。但是在 Windows 中呢? VC9.0 的上限是 499,似乎没有设置模板深度的选项,请参阅 here

最佳答案

如果您使用的是 GCC,您可以使用 -ftemplate-depth=X 设置模板递归深度,其中 X 是所需的深度:

g++ ...... -ftemplate-depth=750

请记住,这不仅仅是您可以任意设置的一些限制。在某些时候,您会遇到操作系统和硬件限制。

关于您的实际 sum 函数,前 N 个正整数的 Sum 有一个众所周知的解析解。

(即 n*(n+1)/2)

关于c++ - 模板元编程递归上限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12277732/

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