模板元计算实际上是利用编译器在编译时,需要把模板展开的特性,进行计算的。
例子: 计算X的Y次方
template
class X_exp_Y
{
public:
enum { result_ = X * X_exp_Y(Base, Exp-1)::result_; };
};
结束条件: (当模板展开到这个层次时,结束)
template
class X_exp_Y
{
public:
enum { result = 1; };
};
再看主程序:
int main()
{
int result = X_exp_Y<10, 5>::result_;
std::cout << "10 exp 5 is: " << result << std::endl;
return 0;
}
这样,在编译期间,就会对X_exp_Y<10, 5>进行展开,过程中会对result_进行计算. 这样实际运行时,呵呵,得到的结果相当于对result进行赋值操作.
这样就实现了把一部分计算工作转交给编译器. 模板元计算特别适合于递归操作. 但是编译器有展开层次的限制,C++标准建议最小为17层.
g++可以指定展开层次: -ftemplate-depth-1000, 把展开层次增加到1000层.
1 条评论:
fwx说: 编译不过。应该为xxxxx.我真晕。原来是发不上去。破博客CMS
发表评论