【C++深度剖析教程40】使用数值型模板技术计算1+2+3+...+N的值
发布日期:2021-07-01 00:05:33 浏览次数:4 分类:技术文章

本文共 1226 字,大约阅读时间需要 4 分钟。

上一篇文章学习了数值型模板技术,并利用相关技术,实现了C++的数组类模板。点击文章查看上一篇文章:

本篇文章,继续利用模板技术来解决一个问题。

如果想求1+2+3+…+N的结果,有很多种方法。可以循环遍历,可以直接使用公式求解。但是他们都不是最快的方法,我们今天使用模板技术,来最快速的求出结果。

1、回顾

模板参数可以是数值型参数。也就是非类型参数。如下图所示:

在这里插入图片描述

我们可以像上面定义一个局部数组,但是却不能这样定义:

int n=10;func
();

上面这种写法就是错的!!!

实际上,不光是类型参数不能为数值型模板参数,下面几种情况也不能作为模板参数

  • 浮点数不能作为模板参数
  • 变量不能作为模板参数(上面的int n)
  • 类对象不能作为模板参数

实际上,数值型模板参数是必须在编译阶段被处理的单元,因此在编译阶段数值型模板参数必须被准确无误的确定。向上面的变量,类对象等,都是只有在运行的时候才能够被确定的,所以不能作为数值型模板的参数。

2、解决方法

如果想求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

转载地址:https://lyy-0217.blog.csdn.net/article/details/84933827 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【软件开发底层知识修炼】九 链接器-可重定位文件与可执行文件
下一篇:【C++深度剖析教程39】实现C++数组类模板

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年05月03日 17时29分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

使用libpcap过滤arp 2019-05-01
微软C/C++ 编译器选项参考 2019-05-01
VS 2005使用map文件查找程序崩溃原因 2019-05-01
VC下发布的Release版程序的异常捕捉 2019-05-01
DivX和XviD不能不说的故事 2019-05-01
C++异常中的堆栈跟踪 2019-05-01
使用dbghelp获取调用堆栈--release下的调试方法 2019-05-01
星巴克高管称Windows 8将无足轻重 2019-05-01
三层网络体系结构的特点和实现方法 2019-05-01
调试Release发布版程序的Crash错误(一) 2019-05-01
在VC环境中调试跟踪变量 2019-05-01
SetUnhandledExceptionFilter使用 2019-05-01
YUV视频格式到RGB32格式转换的速度优化 中篇 2019-05-01
YUV视频格式到RGB32格式转换的速度优化 下篇 2019-05-01
一个简单而又灵活的IOCP模块——完成端口通讯服务器(IOCP Socket Server)设计(四) 2019-05-01
linux下进程的最大线程数、进程最大数、进程打开的文件数 2019-05-01
敏捷开发生态系统系列之一:序言及需求管理生态(客户价值导向-可工作软件-响应变化) 2019-05-01
敏捷开发生态系统系列之二:敏捷生态系统-计划跟踪 I(跨职能团队-共同估算-每日立会-同行压力) 2019-05-01
敏捷开发生态系统系列之三:计划跟踪II(需求优先级排序-迭代期内无变更-团队承诺) 2019-05-01
敏捷开发生态系统系列之四:计划跟踪II(自组织团队-开发团队自己估算-PO挑战估算-同行压力) 2019-05-01