模板的Traits
Traits含义就是特性,应用Trait模板参数,使得我们的程序既保持灵活性,同时减少类型参数的数量。能够使得我们对函数进行更加细粒度的控制。
#ifndef TRAIT_H_
#define TRAIT_H_
/*
template<typename T>
T accumulate( const T *begin, const T *end )
{
T total = T(); while ( begin != end ) {
total += *begin;
++begin;
} return total;
}*/ template<typename T>
class AccumulationTraits; template<>
class AccumulationTraits<char>
{
public:
typedef int AccT;
static AccT zero() {
return 0;
}
}; template<>
class AccumulationTraits<short>
{
public:
typedef int AccT;
static AccT zero() {
return 0;
}
}; template<>
class AccumulationTraits<int>
{
public:
typedef long long AccT;
static AccT zero() {
return 0;
}
}; template<>
class AccumulationTraits<unsigned int>
{
public:
typedef unsigned long long AccT;
static AccT zero() {
return 0;
}
}; template<>
class AccumulationTraits<float>
{
public:
typedef double AccT;
static AccT zero() {
return 0;
}
}; template<typename T, typename AT = AccumulationTraits<T> >
class Accum
{
public:
static typename AT::AccT accumulate( const T *begin, const T *end ) {
typename AT::AccT total = AT::zero(); while ( begin != end ) {
total += *begin;
++begin;
} return total;
}
}; template<typename T>
typename AccumulationTraits<T>::AccT accumulate( const T *begin,
const T *end )
{
return Accum<T>::accumulate( begin, end );
} template<typename Traits, typename T>
typename Traits::AccT accumulate( const T *begin, const T *end )
{
return Accum<T, Traits>::accumulate( begin, end );
} #endif
int iv[5] = {1, 2, 3, 4, 5};
double ftotal = accumulate<typename AccumulationTraits<float>, int>( iv, iv + sizeof( iv ) / sizeof( int ) );
EXPECT_EQ( 15, ftotal ); char cv[] = {'a', 'a', 'b', 'b'};
int total = 97 * 2 + 98 * 2;
EXPECT_EQ( total , accumulate( cv, cv + sizeof( cv ) / sizeof( char ) ) );
模板的Traits的更多相关文章
- c++ 模板和traits
#define TEST(ITEMNAME) AddItem(ITEMNAME, #ITEMNAME); template <typename T> void AddItem(T& ...
- 【C++模版之旅】项目中一次活用C++模板(traits)的经历
曾经曾在一个项目中碰到过一个挺简单的问题,但一时又不能用普通常规的方法去非常好的解决,最后通过C++模板的活用,通过traits相对照较巧妙的攻克了这个问题.本文主要想重现问题发生,若干解决方式的比較 ...
- trait与policy模板应用简单示例
trait与policy模板应用简单示例 accumtraits.hpp // 累加算法模板的trait // 累加算法模板的trait #ifndef ACCUMTRAITS_HPP #define ...
- 初识C++模板元编程(Template Mega Programming)
前言:毕设时在开源库上做的程序,但是源码看得很晕(当时导师告诉我这是模板元编程,可以不用太在乎),最近自己造轮子时想学习STL的源码,但也是一样的感觉,大致了解他这么做要干什么,但是不知道里面的机制. ...
- [转载] C++ 多线程编程总结
原文: http://www.cnblogs.com/zhiranok/archive/2012/05/13/cpp_multi_thread.html 在开发C++程序时,一般在吞吐量.并发.实时性 ...
- 跨平台渲染框架尝试 - Texture管理
纹理是渲染器重要的资源,也是比较简单的资源.本文将详细讨论纹理资源的管理. 在资源管理概述中提到,资源就是一堆内存和CPU与GPU的访问权限.纹理管理在资源管理之上,要负责如何使用者一堆内存构造纹理对 ...
- 转 c++多线程编程
c++多线程编程 一直对多线程编程这一块很陌生,决定花一点时间整理一下. os:ubuntu 10.04 c++ 1.最基础,进程同时创建5个线程,各自调用同一个函数 #include <io ...
- [转]Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧
STL中,traits编程技法得到了很大的应用,了解这个,才能一窥STL奥妙所在. 先将自己所理解的记录如下: Traits技术可以用来获得一个 类型 的相关信息的. 首先假如有以下一个泛型的迭代器类 ...
- c/c++ 模板与STL小例子系列<三> traits
c/c++ 模板与STL小例子系列 traits 对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题. 从一个类型为A的指针,转化到类型为B的指针,中间需要用void*来作为中介 ...
随机推荐
- 使用SHA1、SHA2双证书进行微软数字签名
微软是第一个宣布了SHA-1弃用计划,在2016年之后Windows和IE将不再信任SHA-1证书.正好我们公司的数字签名也到期了,索性就重新申请了sha256和sha1的新数字证书,用来给产品签名. ...
- win7系统远程连接其它计算机,并且向远程机传输文件
首先,打开开始菜单,在程序自带的 “附件“ 中找到 "远程桌面连接"并打开,出现远程桌面对话框: 其次,在对话框左下角点击“选项”,选择“本地资源对话框”,在本地设备和资源下点击“ ...
- Mac下显示隐藏文件 以及修改 hosts文件内容
修改hosts 文件内容: 进入etc 文件夹,找到hosts 文件,把该文件复制出来,修改完里面的内容后,先把etc中的hosts 文件删除,然后在把修改后的文件脱机去 可能需要管理员的密码,你输入 ...
- Demo XML 、 JSON 解析 AND 网络HTTP请求
有道云笔记分享:http://note.youdao.com/share/?id=7950b949a5017a698a9ecc95bc250ec5&type=note 后台服务端:C#.服务器 ...
- 3890: [Usaco2015 Jan]Meeting Time( dp )
简单的拓扑图dp.. A(i, j), B(i, j) 表示从点 i 长度为 j 的两种路径是否存在. 用bitset就行了 时间复杂度O(m) --------------------------- ...
- 基于visual Studio2013解决C语言竞赛题之1012连接字符串
题目 解决代码及点评 /* 编写一个函数JOIN,让它实现字符串连接运算功能. */ #include <stdio.h> #include <stdl ...
- Oracle闪回flashback总结
1.说明: Ø 采用的技术. 使用的是多个技术. 1. 闪回日志 2. 回收站 3. 回滚段 无法使用回收站的操作 Drop table xxx purge; Drop ...
- OpenProcessToken令牌函数使用方法
>GetCurrentProcessID 得到当前进程的ID OpenProcessToken得到进程的令牌句柄LookupPrivilegeValue 查询进程的权限AdjustTokenPr ...
- js操作styleSheets
document.styleSheets这个接口可以获取网页上引入的link样式表和style样式表.比如 最后的输出结果如下. 换下代码看看我们具体的styleSheets具体输出什么 这些都是次要 ...
- MFC 在对话框显示图片的多种方法(四种方法)
我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基 ...