泛型编程之特性(traits)
特性(traits):对于某种可能会出错的返回值型别(Return Type),利用类模版进行部分特例化。其思想类似设计模式。
我们只能部分特例化类模板,而不能部分特例化函数模版。——《C++ Primer(5th)》 P628
part 1. 实现 Sigma 函数
功能:将一段范围内的元素求累加和。
1. 错误的代码实例:
- template <typename T>
- T sigma(T* start, T* end)
- {
- T total = T();
- while (start != end)
- total += *start++;
- return total;
- }
1.1 错误原因:
如果传入 char 类型范围(迭代器)“a b c”,理论上计算结果应该返回 294 ,也就是 0x0126 ,存储需要两个字节。但是 char 只有一个字节大小,所以会造成溢出。
实际输出结果为 38 ——也就是溢出之后的值。
2. 正确的代码,采用偏特化,针对不同的型别写出不同的对策——本例中“对策”是声明不同的内置型别来存储返回值类型。
- template <typename T> class SigmaTraits {};
- template<>
- class SigmaTraits <char> // 针对char型的对策
- {
- public: typedef int returnType;
- };
- template<>
- class SigmaTraits <int> // 针对int型的对策
- {
- public: typedef int returnType;
- };
- template <typename T>
- typename SigmaTraits<T>::returnType sigma(T* start, T* end)
- {
- typedef typename SigmaTraits<T>::returnType returnType;
- returnType total = returnType();
- while (start != end)
- {
- total += *start++;
- }
- return total;
- }
3. 调用 sigma 函数的方法方式都是一样的。
3.1 char范围的调用实例:
- char str[] = "abc";
- cout << sigma(str, str + ) << endl;
3.2 int范围的调用实例:
- int arr[] = {, , };
- cout << sigma(arr, arr+) << endl;
4. 总结
理解 traits 更像像是一种设计模式,类似于工厂方法:针对不同的型别,有不同的对策。
模版类 SigmaTraits 叫做 traits template,它含有其参数型别 T 的一个特性(trait),即 ReturnType。
泛型编程之特性(traits)的更多相关文章
- STL源代码分析--萃取编程(traits)技术的实现
1.为什么要出现? 依照默认认定.一个模板给出了一个单一的定义,能够用于用户能够想到的不论什么模板參数!可是对于写模板的人而言,这样的方式并不灵活.特别是遇到模板參数为指针时,若想实现与类型的參量不一 ...
- PHP5.4.0新特性研究
PHP5.4.0新特性研究 1.内建Web Server 这的确是个好的改进,大大的方便了开发人员.以后开发机不装nginx,httpd也行 cd $PHP_INSTALL_PATH ./bin/ph ...
- php框架的特性总结
今天面试问到了php框架的特性,特此在这汇总一下,方便以后查看. Thinkphp 3.2特性: 1.多表查询非常方便,在model 里几句代码就可以完成完成多表的关联操作. 2.融合了smarty ...
- 如何在PHP框架里把Traits使用起来
我们都知道PHP只能使用单一继承,这意味着一个类只能从另一个类继承. 例如,您可能想从几个不同的类继承方法以防止代码重复. PHP 5.4中添加了新的语言特性Traits,而且它在Laravel框架 ...
- STL与泛型编程-第一周笔记-Geekband
1, 模板观念与函数模板 简单模板: template< typename T > T Function( T a, T b) {- } 类模板: template struct Obje ...
- boost 介绍
简介: Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容 ...
- Java 经典入门(一)
一.什么是 Java 技术?为何需要 Java? Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.有许多应用程序和 Web 站点只有在安装 Java 后 ...
- JAVA_jdk下载和环境变量的配置
Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发. 基本组成: Java由四方面组成:Java编程语言.Java类文件格式.Java虚拟 ...
- java基础总结——概述
一.java语言概述 来自维基百科 https://zh.wikipedia.org/wiki/Java Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web ...
随机推荐
- c++中inline函数的意义
inline C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数.关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声 ...
- html 复制 有时不显示样式
是因为有中文的空格 /**HTML**/ div.ani /**css**/ .ani{ width:480px; height:320px; margin:50px auto; overflow: ...
- the command line tools
PhpStorm 10.0.2 http://stackoverflow.com/questions/22572861/error-cant-use-subversion-command-line-c ...
- 深入理解朴素贝叶斯(Naive Bayes)
https://blog.csdn.net/li8zi8fa/article/details/76176597 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.朴素贝叶斯原理简 ...
- cdn,wsgi框架
CDN:分布式服务器 wsgi:http请求----wsgi----web框架
- SQLCE数据工具(Flyhoward Ltd SDF Viewer)
SDF Viewer sdf数据库创建编辑查看 官方下载地址 http://www.flyhoward.com/Download_SDF_Viewer.aspx 用户名:www.cr173.com注 ...
- [py]str list切片-去除字符串首尾空格-递归思想
取出arr的前几项 #方法1 print([arr[0], arr[1]]) #方法2 arr2 = [] for i in range(2): arr2.append(arr[i]) print(a ...
- AngularJS 模型
ng-model 指令将HTML 控制器(input, select, textarea)的值 和 应用程序数据进行绑定. ng-model 指令 ng-model 指令可以将输入域的值与 Angul ...
- matlab中的containers.Map()
matlab中的containers.Map() 标签: matlabcontainers.Map容器map 2015-10-27 12:45 1517人阅读 评论(1) 收藏 举报 分类: Mat ...
- LCD驱动
LCD的驱动情况比较多. 对于一般的LCD,驱动方式有MCU,MPU,SPI等.其中MCU方式不需要输入clk,vsync,hsync等信号.完全可以通过异步来驱动,但是这样难以将屏 幕做到很大.MP ...