c++中的递归结构

Recursive Struct in C++

本文关键字:结构 递归 c++      更新时间:2023-10-16

我发现下面的代码,它似乎工作,但我不能理解它。
它看起来像一个递归结构,但我以前从未见过。

template<int B, int N>
struct Pow {
    enum{ value = B*Pow<B, N-1>::value };
};
template< int B >
struct Pow<B, 0> {
    enum{ value = 1 };
};
int quartic_of_three = Pow<3, 4>::value;

你知道这是什么吗?

这是一种在编译时计算整数幂的方法,依赖于支持必要数量的模板专门化的编译器(即,它不是确切的可移植代码)

阅读你最喜欢的c++课本中的模板

如果你还没有c++教科书,你需要它,看看SO FAQ c++书籍列表


在c++ 11中使用constexpr函数是一个更好的并且(在几年内)可能更易于移植的方法:

#include <iostream>
using namespace std;
constexpr int constpow( int base, int n )
{
    return (n == 0? 1 : base*constpow( base, n - 1 ));
}
int main()
{
    int const quarticOfThree = constpow( 3, 4 );
    wcout << quarticOfThree << endl;
}
但是,visual c++ 11.0不支持

,这是我写这篇文章时visual c++的最新版本

在这个模板定义中需要注意的重要事项是:

  • 模板参数是,而不是许多人通常在模板中期望的类型;
  • 结构模板的value字段是根据这些参数计算的;
  • 当使用0设置时,模板对第二个参数N有部分专门化。
如您所见,模板递归对value字段进行计算。如果没有定义部分专门化,该递归将是无限的。当第二个参数"达到"0时,即当编译器通过模板实例化的嵌套,试图获得计算最外层值所需的连续值字段时,最终需要实例化参数N为0的模板,并选择部分特化版本,其中该字段包含一个常量1。然后编译器可以计算每个嵌套的值字段,最终返回到最外层的值字段。

使用这种技术,可以让编译器离线计算某些值。在编译时)。这使得程序员可以通过参数和公式定义常量值,而不必硬编码它们,或者让编译后的程序在每次运行时计算它们。

但是这种方法的问题在于它的可读性和维护的便利性,尽管它看起来有多聪明。这很可能是新标准提供constexpr概念的原因,这是定义所谓纯计算的一种更合适的方式。


应该注意的是,模板的两个字段都是带符号的,并且计算不会尝试以任何方式处理负值。如果N最初设置为-1,结果可能会很有趣。