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

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

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

1、回顾

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

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

int n=10;
func<double,n>();

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

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

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

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

2、解决方法

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

先上代码,看看如何最快速求解:

#include <iostream>
#include <string>using namespace std;template
< int N >   //这里是数值型模板参数
class Sum
{public:static const int VALUE = Sum<N-1>::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

【C++深度剖析教程40】使用数值型模板技术计算1+2+3+...+N的值相关推荐

  1. 【C++深度剖析教程39】实现C++数组类模板

    上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...

  2. 【C++深度剖析教程38】类模板深度剖析

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.多参数类模板 类模板可以定义任意多个不同的类型参数 类模板可以被特化: 指定类模板的特定实现 部分类型参数必须 ...

  3. 构建万物可信互联的基石,带你深度剖析区块链跨链的关键技术,满满是干货!

    [摘要] 什么是区块链,相信你一定有所了解,那么你是否了解区块链跨链技术呢?本文将从区块链跨链技术的起源发展.相关名词.关键技术和模型实现几个方面进行深度剖析,干货满满! 1.区块链跨链技术诞生背景及 ...

  4. smarty详细使用教程(韩顺平smarty模板技术笔记)

    MVC是一种开发模式,强调数据的输入.处理.显示是强制分离的 Smarty使用教程 1.如何配置我们的smarty 解压后把libs文件夹放在网站第一级目录下,然后创建两个文件夹 templates ...

  5. 系列文章(一):机器学习与深度学习——数据预处理(数值型数据)

    系列文章(一):机器学习与深度学习中的数据预处理(数值型数据) 目录 系列文章(一):机器学习与深度学习中的数据预处理(数值型数据) 一.引言 1.1 为何预处理(Why preprocessing? ...

  6. 【C++深度剖析教程31】被遗弃的多重继承

    加qq1126137994 微信:liu1126137994 C++中是否允许一个类继承多个父类? C++支持编写多重继承的代码: 一个子类可以拥有多个父类 子类拥有所有父类的成员变量 子类继承父类所 ...

  7. 【C++深度剖析教程26】父子间的冲突

    今天继续来学习C++,父类与子类之间的冲突.加qq1126137994共同学习交流. 1.问题 子类中是否可以定义父类中的同名成员,如果可以,如何区分?如果不可以那又为什么? 2.问题的延伸 子类可以 ...

  8. 【C++深度剖析教程25】继承中的构造与析构

    今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...

  9. 【C++的深度剖析教程20】类型转换函数上

    今天来学习类型转换函数. 一回顾 我们学习C语言的时候,都知道,标准的数据类型之间,是可以做类型的转换的.分为隐式类型转换和强制类型转换.那么强制类型转换呢,比较简单.但是隐式类型转换,却存在诸多问题 ...

最新文章

  1. 我在互联网大厂,和同事谈恋爱
  2. CF A. DZY Loves Hash
  3. FTP的主动模式(PORT Mode)及被动模式(Passive Mode)
  4. CSS3详解:background
  5. java反射api研究_深入研究Java 8中的可选类API
  6. Couchbase 2.0归类视图简介
  7. [转] vim自定义配置 和 在ubnetu中安装vim
  8. 数据模型和数据库系统的模型结构
  9. python3入门代码-Python3入门(三)——Python基础语法
  10. (APIO2014)序列分割
  11. 计算机网络监控,计算机网络连接监控系统.doc
  12. ISO27001标准
  13. Thinkpad官方推荐的驱动安装顺序
  14. jcr多久更新一次_2020年期刊影响因子正式发布,几家欢喜几家愁?!
  15. 卡巴斯基2010激活码
  16. 云计算服务包括哪三种服务?怎么定义?
  17. pta第六章错题函数and编程
  18. 如何改变计算机桌面字体,怎么调整电脑桌面字体
  19. element导航菜单添加搜索功能
  20. 奇异值分解的几何原理

热门文章

  1. Qt 给应用程序添加图标
  2. WSL2 安装中文输入法教程 简单有效
  3. 一文了解类别型特征的编码方法
  4. vb.net中滚动条一直显示没有数据时也显示_Android Studio 中 System Trace 的新增功能...
  5. 远程上传下载文件-Xftp5
  6. typescript在ES3(IE7)环境下使用async、await
  7. cocos2d-x-3.x 动作(5)序列动作
  8. Chapter 5 Exercises Problems
  9. 展示29个美丽的iPhone壁纸
  10. windows7下iis网站的.net框架版本设置