trait与policy模板应用简单示例

accumtraits.hpp // 累加算法模板的trait

// 累加算法模板的trait
#ifndef ACCUMTRAITS_HPP
#define ACCUMTRAITS_HPP template <typename T>
class AccumulationTraits; // 只有声明 template <>
class AccumulationTraits<char> // 把具体类型char映射到int,累加后就返回int
{
public:
typedef int AccT; // 统一的类型别名,表示返回类型
static AccT zero() // 关联一个缺省值,是累加时的初始缺省值
{
return ;
}
}; template <>
class AccumulationTraits<short> // 把具体类型short映射到累加后的返回类型int
{
public:
typedef int AccT;
static AccT zero() // 没有直接在类内部定义static变量并提供缺省值,而是使用了函数
{ // 因为类内部只能对整型和枚举类型的static变量进行初始化 // 其他类型的必须类内部声明,在外部进行初始化
return ;
}
}; template <>
class AccumulationTraits<int>
{
public:
typedef long AccT;
static AccT zero()
{
return ;
}
}; template <>
class AccumulationTraits<unsigned int>
{
public:
typedef unsigned long AccT;
static AccT zero()
{
return ;
}
}; template <>
class AccumulationTraits<float>
{
public:
typedef double AccT;
static AccT zero()
{
return ;
}
}; #endif // !ACCUMTRAITS_HPP

policies.hpp // 累加算法模板的policy

// 累加算法模板的policy
#ifndef POLICIES_HPP
#define POLICIES_HPP template <typename T1, typename T2>
class SumPolicy // 累加的策略
{
public:
static void accumulate(T1 & total, T2 const & value)
{
total += value; // 累加
}
}; template <typename T1, typename T2>
class MultPolicy // 累乘的策略
{
public:
static void accumulate(T1 & total, T2 const & value)
{
total *= value; // 累乘
}
}; #endif // !POLICIES_HPP

accum.hpp // 累加算法模板:实现为类模板,用模板参数来传递policy和trait

// 累加算法模板:实现为类模板,用模板参数来传递policy和trait
// 可用一个内联函数模板作为包装器来包装这个类模板实现
#ifndef ACCUM_HPP
#define ACCUM_HPP #include "accumtraits.hpp"
#include "policies.hpp"
#include <iostream> template < typename T, // 这里使用 typename 和 class 没有区别
const int INITVAL = , // INITVAL 是一个 无类型模板参数
template <typename, typename> class Policy = SumPolicy, // 这里的必须使用class不能是typename, 因为 Policy 是类类型, 默认采用SumPolicy策略
typename Traits = AccumulationTraits<T> > // 模板参数Traits代表要使用的trait
class Accum
{
public:
// AccumulationTraits 是一个 standard traits class (标准特性类)
// AccT 嵌套在 AccumulationTraits<T> 内部类型, 而且 T 是一个模版参数
// AccT 是一个 nested dependent type name (嵌套依赖类型名), 必须被 typename 前置
static typename Traits::AccT accum(T const * beg, T const * end)
{
// total 是一个与 AccT 类型所指向的类型相同的局部变量
// zero() 嵌套在 AccumulationTraits<T> 内部函数, 而且 T 是一个模版参数
//typename Traits::AccT total = Traits::zero(); // 获取缺省值, 返回 0 // 存在问题: 当策略为 MultPolicy 会造成结果始终为 0
typename Traits::AccT total = INITVAL; // 把初始值当作【无类型模板参数】传递进来
while (beg != end) // 作累积运算
{
Policy<Traits::AccT, T>::accumulate(total, *beg); // 使用给定的算法策略来进行累积
++beg;
}
return total; // 返回累积起来的值
}
}; //// 用内联的函数模板来包装, 对默认的参数,提供对应的重载函数
template <typename T, const int INITVAL, template <typename, typename> class Policy, typename Traits>
inline typename Traits::AccT accum(T const * beg, T const * end)
{
std::cout << "<typename T, const int INITVAL, template <typename, typename> class Policy, typename Traits> \n\t---> <T, INITVAL, Policy, Traits>" << std::endl; // 标记使用
return Accum<T, INITVAL, Policy, Traits>::accum(beg, end);
} template <typename T, const int INITVAL, template <typename, typename> class Policy>
inline typename AccumulationTraits<T>::AccT accum(T const * beg, T const * end)
{
std::cout << "<typename T, const int INITVAL, template <typename, typename> class Policy> \n\t---> <T, INITVAL, Policy, AccumulationTraits<T>>" << std::endl; // 标记使用
return Accum<T, INITVAL, Policy, AccumulationTraits<T>>::accum(beg, end);
} template <typename T, const int INITVAL>
inline typename AccumulationTraits<T>::AccT accum(T const * beg, T const * end)
{
std::cout << "<typename T, const int INITVAL> \n\t---> <T, INITVAL, MultPolicy, AccumulationTraits<T>>" << std::endl; // 标记使用
return Accum<T, INITVAL, MultPolicy, AccumulationTraits<T>>::accum(beg, end);
} template <typename T>
inline typename AccumulationTraits<T>::AccT accum(T const * beg, T const * end)
{
std::cout << "<typename T> \n\t---> <T, 1, MultPolicy, AccumulationTraits<T>>" << std::endl; // 标记使用
return Accum<T, , MultPolicy, AccumulationTraits<T>>::accum(beg, end);
} template <>
inline typename AccumulationTraits<int>::AccT accum(int const * beg, int const * end)
{
std::cout << "<> \n\t---> <int, 1, MultPolicy, AccumulationTraits<int>>" << std::endl; // 标记使用
return Accum<int, , MultPolicy, AccumulationTraits<int>>::accum(beg, end);
} #endif // !ACCUM_HPP

mytest.cpp // 使用累加算法的客户端测试代码

// 使用累加算法的客户端测试代码
#include "accum.hpp"
#include <iostream> int main()
{
int num[] = {,,,,}; // 整型数组
std::cout << "============= integer array =============" << std::endl;
std::cout << "the total value of the integer values is "
<< accum<int, , MultPolicy, AccumulationTraits<int>>(&num[], &num[]) << std::endl;
std::cout << "the total value of the integer values is "
<< accum<int, , MultPolicy>(&num[], &num[]) << std::endl;
std::cout << "the total value of the integer values is "
<< accum<int, >(&num[], &num[]) << std::endl;
std::cout << "the total value of the integer values is "
<< accum<int>(&num[], &num[]) << std::endl;
std::cout << "the total value of the integer values is "
<< accum<>(&num[], &num[]) << std::endl;
std::cout << "the total value of the integer values is "
<< accum(&num[], &num[]) << std::endl; char name[] = "templates"; // 创建字符值数组
int length = sizeof(name)-;
std::cout << "============= characters array =============" << std::endl;
std::cout << "the total value of the characters in \""
<< name << "\" is " << accum<char, , SumPolicy, AccumulationTraits<char>>(&name[], &name[length]) << std::endl;
std::cout << "the total value of the characters in \""
<< name << "\" is " << accum<char, , SumPolicy>(&name[], &name[length]) << std::endl;
std::cout << "the total value of the characters in \""
<< name << "\" is " << accum<char, >(&name[], &name[length]) << std::endl;
std::cout << "the total value of the characters in \""
<< name << "\" is " << accum<char>(&name[], &name[length]) << std::endl;
std::cout << "the total value of the characters in \""
<< name << "\" is " << accum<>(&name[], &name[length]) << std::endl;
std::cout << "the total value of the characters in \""
<< name << "\" is " << accum(&name[], &name[length]) << std::endl; system("pause");
return ;
}

输出结果:

============= integer array =============
<typename T, const int INITVAL, template <typename, typename> class Policy, typename Traits>
---> <T, INITVAL, Policy, Traits>
the total value of the integer values is 120
<typename T, const int INITVAL, template <typename, typename> class Policy>
---> <T, INITVAL, Policy, AccumulationTraits<T>>
the total value of the integer values is 120
<typename T, const int INITVAL>
---> <T, INITVAL, MultPolicy, AccumulationTraits<T>>
the total value of the integer values is 120
<>
---> <int, 1, MultPolicy, AccumulationTraits<int>>
the total value of the integer values is 120
<>
---> <int, 1, MultPolicy, AccumulationTraits<int>>
the total value of the integer values is 120
<>
---> <int, 1, MultPolicy, AccumulationTraits<int>>
the total value of the integer values is 120
============= characters array =============
<typename T, const int INITVAL, template <typename, typename> class Policy, typename Traits>
---> <T, INITVAL, Policy, Traits>
the total value of the characters in "templates" is 975
<typename T, const int INITVAL, template <typename, typename> class Policy>
---> <T, INITVAL, Policy, AccumulationTraits<T>>
the total value of the characters in "templates" is 975
<typename T, const int INITVAL>
---> <T, INITVAL, MultPolicy, AccumulationTraits<T>>
the total value of the characters in "templates" is 0
<typename T>
---> <T, 1, MultPolicy, AccumulationTraits<T>>
the total value of the characters in "templates" is 465857536
<typename T>
---> <T, 1, MultPolicy, AccumulationTraits<T>>
the total value of the characters in "templates" is 465857536
<typename T>
---> <T, 1, MultPolicy, AccumulationTraits<T>>
the total value of the characters in "templates" is 465857536
请按任意键继续. . .

trait与policy模板应用简单示例的更多相关文章

  1. trait与policy模板技术

    trait与policy模板技术 我们知道,类有属性(即数据)和操作两个方面.同样模板也有自己的属性(特别是模板参数类型的一些具体特征,即trait)和算法策略(policy,即模板内部的操作逻辑). ...

  2. [DeviceOne开发]-轮播图和多模板的简单示例

    一.简介 这个例子是利用Slideview组件实现循环轮播的效果,同时这个slideview作为一个listview的最上面的一行数, 1. listview有2个模板,一个是以slideview为核 ...

  3. [JavaWeb基础] 020.Velocity 模板引擎简单示例

    1.什么是Velocity 一种J2EE的前端模版技术,和JSP,Freemarker差不多,都是用来展示网页内容的.和JSP不同的是velocity只能显示Action中的数据,不能处理数据.不能写 ...

  4. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  5. C++ template —— trait与policy类(七)

    第15章 trait与policy类---------------------------------------------------------------------------------- ...

  6. spring-servlet.xml简单示例

    spring-servlet.xml简单示例 某个项目中的spring-servlet.xml 记下来以后研究用 <!-- springMVC简单配置 --> <?xml versi ...

  7. SignalR 简单示例

    一.什么是 SignalR ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of add ...

  8. Web API 简单示例

    一.RESTful和Web API Representational State Transfer (REST) is a software architecture style consisting ...

  9. asp.net模板控件示例

    原文:asp.net模板控件示例 模板控件允许将控件数据与其表示形式相分离,模板化控件不提供用户界面. 编写它则是为了实现一个命名容器以及包含属性和方法可由宿主页访问的类,MSDN是这样解释的. 下面 ...

随机推荐

  1. Java实现CORS跨域请求

    问题 使用前后端分离模式开发项目时,往往会遇到这样一个问题 -- 无法跨域获取服务端数据 这是由于浏览器的同源策略导致的,目的是为了安全.在前后端分离开发模式备受青睐的今天,前端和后台项目往往会在不同 ...

  2. iOS蓝牙心得

    1.获取蓝牙mac地址 因为安卓不能得到uuid,所以,在要同步的时候要将uuid转换成mac地址,下面是转换方法 [peripheral discoverServices:@[[CBUUID UUI ...

  3. 浅析强连通分量(Tarjan和kosaraju)

    理解   在有向图G中,如果两点互相可达,则称这两个点强连通,如果G中任意两点互相可达,则称G是强连通图. 定理: 1.一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次.     ...

  4. Linux学习——yum学习和光盘yum源搭建

    在rmp安装的时代,rpm包依赖让安装人员头大,而且头疼,有了yum后整个的安装更加简单和方便. yum源文件 1.yum源的介绍: 将所有的软件包放到官方服务器上,当进行yum在线安装时,可以自动解 ...

  5. bzoj2730(矿场搭建)

    矿场搭建,不知道为什么,莫名其妙T了在212上,额,zyh数据真的坑. bzoj200轻松跑过啊. 就是点双联通分量缩点,然后标记割点,一个块如果有>=2个割点,则不需要挖矿洞, 如果只有一割点 ...

  6. NOIP2017SummerTraining0726

    三道比较简单的题,还以为是八校考试的题目,但是并不是,无语了,第三题其实看了挺久的,一看到图,就想到了二分图,网络流之类的算法,但是尽力往这个方向想了好久都没什么思路, 最后从简单入手,然而没什么结果 ...

  7. NOIP2017SummerTraining0720

    这套题,看到第一题就想到了以前做过的运动鞋那道题,然后就往DP这个方向去思考,想来想去每什么思路,然后就去看第二题,第二题一看就是一道最短路的问题,但是它的建图十分困难, 怎么打都不知到该怎么建图,然 ...

  8. 面向对象oop

    类和对象 1.什么是类?什么是对象? 1)现实世界是由很多很多对象组成的 基于对象抽出了类 2)对象:真实存在的单个的个体 类:类型/类别,代表一类个体 3)类中可以包含: 3.1)所有对象所共有的属 ...

  9. __无标题栏的窗口拖动___javafx

    遇到困难::添加mouseevent监听,我用的mouse_DragedDetected配合MouseEvent.Pressed,,闪的不行,后来借鉴swing的pressed,move,releas ...

  10. 【Learning】多项式乘法与快速傅里叶变换(FFT)

    简介: FFT主要运用于快速卷积,其中一个例子就是如何将两个多项式相乘,或者高精度乘高精度的操作. 显然暴搞是$O(n^2)$的复杂度,然而FFT可以将其将为$O(n lg n)$. 这看起来十分玄学 ...