本文共 1226 字,大约阅读时间需要 4 分钟。
上一篇文章学习了数值型模板技术,并利用相关技术,实现了C++的数组类模板。点击文章查看上一篇文章:
本篇文章,继续利用模板技术来解决一个问题。
如果想求1+2+3+…+N的结果,有很多种方法。可以循环遍历,可以直接使用公式求解。但是他们都不是最快的方法,我们今天使用模板技术,来最快速的求出结果。
模板参数可以是数值型参数。也就是非类型参数。如下图所示:
我们可以像上面定义一个局部数组,但是却不能这样定义:
int n=10;func();
上面这种写法就是错的!!!
实际上,不光是类型参数不能为数值型模板参数,下面几种情况也不能作为模板参数
实际上,数值型模板参数是必须在编译阶段被处理的单元,因此在编译阶段数值型模板参数必须被准确无误的确定。向上面的变量,类对象等,都是只有在运行的时候才能够被确定的,所以不能作为数值型模板的参数。
如果想求1+2+3+…+N的结果,有很多种方法。可以循环遍历,可以直接使用公式求解。但是他们都不是最快的方法,我们今天使用模板技术,来最快速的求出结果。
先上代码,看看如何最快速求解:
#include#include using namespace std;template< int N > //这里是数值型模板参数class Sum{ public: static const int VALUE = Sum ::VALUE + N; //这里是一个递归的过程};/* 递归过程的终止条件 */template< >class Sum < 1 >{ public: static const int VALUE = 1;};int main(){ cout << "1 + 2 + 3 + ... + 10 = " << Sum<10>::VALUE << endl; cout << "1 + 2 + 3 + ... + 100 = " << Sum<100>::VALUE << endl; return 0;}
上面的代码运行结果为:
很明显,结果完全正确!!!
那么为什么它是最快的方法呢?
首先,我们知道,数值型模板参数都是在编译阶段确定了的,所以,上述代码的VALUE实际上是在编译的时候,就已经确定好了值,最后直接调用这个值,就是计算结果。这肯定比任何计算都要快(这归功于编译器,编译器为我们做了很多事)。
本文参考狄泰软件学院相关课程
想学习的可以加狄泰软件学院群, 群聊号码:199546072学习探讨加个人(可以免费帮忙下载CSDN资源):
qq:1126137994 微信:liu1126137994转载地址:http://ibytf.baihongyu.com/