特性(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)的更多相关文章

  1. STL源代码分析--萃取编程(traits)技术的实现

    1.为什么要出现? 依照默认认定.一个模板给出了一个单一的定义,能够用于用户能够想到的不论什么模板參数!可是对于写模板的人而言,这样的方式并不灵活.特别是遇到模板參数为指针时,若想实现与类型的參量不一 ...

  2. PHP5.4.0新特性研究

    PHP5.4.0新特性研究 1.内建Web Server 这的确是个好的改进,大大的方便了开发人员.以后开发机不装nginx,httpd也行 cd $PHP_INSTALL_PATH ./bin/ph ...

  3. php框架的特性总结

    今天面试问到了php框架的特性,特此在这汇总一下,方便以后查看. Thinkphp 3.2特性: 1.多表查询非常方便,在model 里几句代码就可以完成完成多表的关联操作. 2.融合了smarty ...

  4. 如何在PHP框架里把Traits使用起来

    我们都知道PHP只能使用单一继承,这意味着一个类只能从另一个类继承. 例如,您可能想从几个不同的类继承方法以防止代码重复.  PHP 5.4中添加了新的语言特性Traits,而且它在Laravel框架 ...

  5. STL与泛型编程-第一周笔记-Geekband

    1, 模板观念与函数模板 简单模板: template< typename T > T Function( T a, T b) {- } 类模板: template struct Obje ...

  6. boost 介绍

    简介: Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容 ...

  7. Java 经典入门(一)

    一.什么是 Java 技术?为何需要 Java? Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.有许多应用程序和 Web 站点只有在安装 Java 后 ...

  8. JAVA_jdk下载和环境变量的配置

    Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发. 基本组成: Java由四方面组成:Java编程语言.Java类文件格式.Java虚拟 ...

  9. java基础总结——概述

      一.java语言概述 来自维基百科 https://zh.wikipedia.org/wiki/Java Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web ...

随机推荐

  1. POJ-2777 Count Color(线段树,区间染色问题)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40510 Accepted: 12215 Descrip ...

  2. 把本地项目文件上传到github远程仓库的教程

    参考廖雪峰的git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000  非常详 ...

  3. CodeForces - 669D Little Artem and Dance 想法题 多余操作

    http://codeforces.com/problemset/problem/669/D 题意:n个数1~N围成一个圈.q个操作包括操作1:输入x, 所有数右移x.操作2:1,2位置上的数(swa ...

  4. Image processing in Python

    http://scikit-image.org/docs/dev/auto_examples/

  5. php:// — 访问各个输入/输出流(I/O streams)

    PHP: php:// - Manual http://www.php.net/manual/zh/wrappers.php.php php:// php:// — 访问各个输入/输出流(I/O st ...

  6. javascript 调用cookies

    cookie   用来保存信息,并且与服务器互动,因此前端后端都可以使用cookie     值得一提的是:虽然cookie是以文件的形式存储在客户端的电脑上, 但浏览器只会让创建cookie的网站访 ...

  7. python中url解析 or url的base64编码

    目录 from urllib.parse import urlparse, quote, unquote, urlencode1.解析url的组成成分:urlparse(url)2.url的base6 ...

  8. 代码实现SQL SERVER TCP/IP协议配置

    代码实现SQL SERVER TCP/IP协议配置 SET NOCOUNT ON ) ,) ,) SET @Root = 'HKEY_LOCAL_MACHINE' SET @Path = 'Softw ...

  9. SQL Server表分区-水平分区

    SQL Server表分区,sql server水平分区 转自:http://www.cnblogs.com/knowledgesea/p/3696912.html  根据时间的,直接上T-SQL代码 ...

  10. vue中两种路由跳转拼接参数

    this.$router.push({name:"Home",query:{id:1,name:2}}) // 取到路由带过来的参数 let routerParams = this ...