c++中的递归结构
Recursive Struct in C++
我发现下面的代码,它似乎工作,但我不能理解它。
它看起来像一个递归结构,但我以前从未见过。
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不支持
在这个模板定义中需要注意的重要事项是:
- 模板参数是值,而不是许多人通常在模板中期望的类型;
- 结构模板的
value
字段是根据这些参数计算的; - 当使用
0
设置时,模板对第二个参数N
有部分专门化。
value
字段进行计算。如果没有定义部分专门化,该递归将是无限的。当第二个参数"达到"0
时,即当编译器通过模板实例化的嵌套,试图获得计算最外层值所需的连续值字段时,最终需要实例化参数N为0
的模板,并选择部分特化版本,其中该字段包含一个常量1
。然后编译器可以计算每个嵌套的值字段,最终返回到最外层的值字段。使用这种技术,可以让编译器离线计算某些值。在编译时)。这使得程序员可以通过参数和公式定义常量值,而不必硬编码它们,或者让编译后的程序在每次运行时计算它们。
但是这种方法的问题在于它的可读性和维护的便利性,尽管它看起来有多聪明。这很可能是新标准提供constexpr
概念的原因,这是定义所谓纯计算的一种更合适的方式。
应该注意的是,模板的两个字段都是带符号的,并且计算不会尝试以任何方式处理负值。如果N最初设置为-1
,结果可能会很有趣。
相关文章:
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 如何在C++中表示JSON文档的递归对象结构?
- C++ 递归返回 nullptr 中的结构 ?.
- 递归如何使用堆栈数据结构
- 如何制作递归编译时间变异结构模板
- 没有指针的递归结构?(霍夫曼)
- 使用boost::序列化递归图结构时,如何防止堆栈溢出
- 递归结构的向量有内存问题
- C++,一个通用递归模板函数,用于遍历树状结构
- 如果结构作为递归函数中的参数传递,如何初始化结构的成员变量
- 节省增强精神递归匹配结果为C 结构
- 用载体建立在苍蝇递归结构上
- 双递归结构
- 如何计算递归结构
- 使用结构和递归查找整数数组中的最大数字
- 协议缓冲区、Apache Thrift或任何其他数据结构序列化协议中的递归数据结构
- 递归类型真的是构建不连续的任意大小数据结构的唯一方法吗
- 可变参数模板实例化中的无限递归,试图构建任意深度的树状结构
- 递归数据结构的前向声明
- 正在分析boost::spirit上的递归结构